
Issue #20738 has been updated by ursm (Keita Urashima). I believe that the following two points will prevent the same problems as in the past: 1. Use a value that is never used (e.g., Hash::DROP) instead of nil. 2. Special treatment of “special value” only if the hash is constructed with literals. ``` ruby { foo: Hash::DROP } #=> {} h = {} h[:foo] = Hash::DROP h #=> {foo: Hash::DROP} ``` Note that I am not concerned with the “special value” approach. If there is a better way, please let me know. ---------------------------------------- Feature #20738: Removing a specific entry from a hash literal https://bugs.ruby-lang.org/issues/20738#change-109774 * 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/