
Issue #20738 has been updated by ursm (Keita Urashima). It would be better to explain the motive. This is an appropriate code. ``` ruby { foo: 1 bar: 2 } ``` This is not a mistake, but it's a circuitous code. ``` ruby h = {} h[:foo] = 1 h[:bar] = 2 h ``` The gist of this proposal is that if a condition is included, it should be written in the same form as the “appropriate code”. ``` ruby h = {} h[:foo] = 1 h[:bar] = 2 if bar? h ``` ---------------------------------------- Feature #20738: Removing a specific entry from a hash literal https://bugs.ruby-lang.org/issues/20738#change-109788 * Author: ursm (Keita Urashima) * Status: Open ---------------------------------------- Sometimes I want to decide whether or not to add a particular entry to a hash depending on a condition. If the entire hash does not use nil, I can use Hash#compact. ```ruby { foo: 1, bar: bar? ? 2 : nil }.compact ``` But if I want to remove only a specific entry while leaving the other nil, it is somewhat cumbersome. I have to either assign the hash once and change it destructively, or use Hash#reject. ``` ruby h = { foo: 1, baz: nil } h[:bar] = 2 if bar? ``` ``` ruby { foo: 1, bar: bar? ? 2 : :drop, baz: nil }.reject {|_, v| v == :drop } ``` As a suggestion, how about a special value that indicates an invalid key for the hash? With this, the above example could be written like this: ``` ruby { foo: 1, bar: bar? ? 2 : Hash::DROP, baz: nil } #=> {foo: 1, baz: nil} ``` -- https://bugs.ruby-lang.org/