[ruby-core:77299] [Ruby trunk Feature#12770][Feedback] Hash#left_merge
From:
duerst@...
Date:
2016-09-17 07:47:15 UTC
List:
ruby-core #77299
Issue #12770 has been updated by Martin D端rst.
Status changed from Open to Feedback
Assignee deleted (Yukihiro Matsumoto)
Derek Kniffin wrote:
> I've also got a first draft of the method definition:
>
> ````ruby
> def left_merge(new_hash)
> merge(new_hash) { |_, old_v, new_v| old_v || new_v }
> end
> ````
If the definition is as easy as that, it doesn't look really worthwhile to create a new method. There are lots of different ways to merge hashes, and that's what the block can take care of!
However, when I actually use that definition, then for
> ````ruby
> a = {a: 1, b: nil, c: 3, d: nil}
> b = {a: 1, b: 2, c: 4, e:nil}
> a.left_merge(b)
> ````
I get `{ a: 1, b: 2, c: 3, d: nil, e: nil }`
and not `{ a: 1, b: 2, c: 3, d: nil }`.
So what exactly do you want?
----------------------------------------
Feature #12770: Hash#left_merge
https://bugs.ruby-lang.org/issues/12770#change-60536
* Author: Derek Kniffin
* Status: Feedback
* Priority: Normal
* Assignee:
----------------------------------------
I would like a Hash method that does the following:
````ruby
a = {a: 1, b: nil, c: nil, d: nil}
b = {a: 1, b: 2, c: nil}
a.left_merge(b) # => {a: 1, b: 2, c: nil, d: nil}
````
So, it takes the first hash, and for any values that are nil, if there's a value for that key in the second hash, fill in the value from the second hash.
I've searched around a bit, and I haven't found this anywhere, so I'd like to propose a new one: `Hash#left_merge`. I've also got a first draft of the method definition:
````ruby
class Hash
def left_merge(new_hash)
merge(new_hash) { |_, old_v, new_v| old_v || new_v }
end
end
````
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>