Issue #10270 has been updated by Atlas Prime. The name "insert" seems good to me because it implies a *new* entry and unable to change an *old* entry. But key-value pair must be thought of as an *entry* too for it to make sense (I guess I get that notion from Java http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html). I did not know that merge took this block. That could be useful. But it's not quite the same because insert returns true/false if successful of not. It's utility is mostly as a short cut for if !h.key?(k) store(k,v) ... end Instead one can do if h.insert(k,v) ... end However, you make me think it might be useful too if it could take a hash and a block. def insert_merge(other, &block) other.each do |k, v| if key?(k) block.call(false, k, v) else store(k,v) block.call(true, k, v) end end end ---------------------------------------- Feature #10270: Hash#insert https://bugs.ruby-lang.org/issues/10270#change-49031 * Author: Atlas Prime * Status: Feedback * Priority: Normal * Assignee: * Category: core * Target version: ---------------------------------------- Hash doesn't appear to have a "safe" way to insert an entry that won't clobber another key if it is already there. So how about: ~~~ class Hash # Like Hash#store but only stores if the key isn't already # in the hash. Returns true if inserted, otherwise false. # def insert(name, value) if key?(name) false else store(name,value) true end end end ~~~ -- https://bugs.ruby-lang.org/