Project

General

Profile

Actions

Feature #15111

closed

Make the number of arguments of `Hash#merge` variable

Added by liwii (Koki Ryu) over 5 years ago. Updated over 5 years ago.

Status:
Closed
Target version:
-
[ruby-core:88970]

Description

Abstract

Make the number of arguments of Hash#merge variable.

Background

In many websites such as Stack Overflow and Qiita, many people are seeking how to merge more than three hashes.

https://stackoverflow.com/questions/19548496/how-to-merge-multiple-hashes-in-ruby
https://qiita.com/hc0208/items/c662f5189fa383872f4e
https://stackoverrun.com/ja/q/4997431

Many ways, like using Enumerable#inject or calling Hash#merge multiple times, are proposed, but both don't seem intuitive. Especially when using block in Hash#merge, the code becomes too complicated.

Proposal

Change the argument of Hash#merge from singular to variable length.

Implementation

https://github.com/ruby/ruby/pull/1951

Evaluation

The code to merge more than three hashes became much simpler and more intuitive.

before

hash1.merge(hash2).merge(hash3)

[hash1, hash2, hash3].inject do |result, part|
  result.merge(part) { |key, value1, value2| key + value1 + value2 }
end

after

hash1.merge(hash2, hash3)
hash1.merge(hash2, hash3) { |key, value1, value2| key + value1 + value2 }

Discussion

Summary

The change is needed to make Hash#merge more useful and intuitive.

Updated by liwii (Koki Ryu) over 5 years ago

If no argument is given to Hash#merge, the receiver itself is returned. In this way, Hash instance can revieve Array as arguments without concerning if the Array is empty.

hash1 = {a: 1, b: 2}
hashes = return_array_of_hashes
hash1.merge(*hashes) #=> It can't raise error even if `hashes` is empty.

Updated by mame (Yusuke Endoh) over 5 years ago

  • Status changed from Open to Assigned
  • Assignee set to mame (Yusuke Endoh)

As I recall, Matz has accepted this ticket at the day of developers' meeting. I'll commit it soon.

Actions #3

Updated by mame (Yusuke Endoh) over 5 years ago

  • Status changed from Assigned to Closed

Applied in changeset trunk|r64777.


  • hash.c (rb_hash_merge): Accepts zero or more hashes as arguments

Hash#merge, merge!, and update could merge exactly two hashes.
Now, they accepts zero or more hashes as arguments so that it can merge
hashes more than two.

This patch was created by Koki Ryu at Ruby Hack
Challenge #5. Thank you!
[ruby-core:88970] [Feature #15111] [Fix GH-1951]

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0