Issue #15111 has been updated by liwii (Koki Ryu).


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.

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

```

----------------------------------------
Feature #15111: Make the number of arguments of `Hash#merge` variable
https://bugs.ruby-lang.org/issues/15111#change-74022

* Author: liwii (Koki Ryu)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
# 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
```ruby
hash1.merge(hash2).merge(hash3)

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

after
```ruby
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.



-- 
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>