
Issue #20738 has been updated by Eregon (Benoit Daloze). I don't think it's OK to magically drop entries from a literal based on some value, it's way too surprising. And of course `Hash::DROP` could leak into some variable and then unintentionally drop an entry, that'd be horrible to debug. Notably this would make the capacity of the literal potentially wrong, etc. ```ruby { foo: 1, **({ bar: 2 } if bar?) } # OR h[:bar] = 2 if bar? ``` Sounds good enough to me. I don't think it's very frequent to need this to warrant a syntax change either. ---------------------------------------- Feature #20738: Removing a specific entry from a hash literal https://bugs.ruby-lang.org/issues/20738#change-109776 * 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/