Issue #10315 has been updated by Peter Zotov.


Nobuyoshi Nakada wrote:
> Applied in changeset r47877.
> 
> ----------
> parse.y: precedence of duplicated keys
> 
> * parse.y (assocs): concatenate splatted literal hashes.  the
>   former key has precedence even if duplicated literal keys
>   follow.  [ruby-core:65368] [Bug #10315]

There is a problem with this solution. Namely, duplicate key-value pairs are removed at parsing stage, and if they had side effects (like printing), the semantics changes.

For example:
~~~
p({k1: p('a'), k1: p('b')})         #=> {:k1=>"b"}
p({k1: p('a')}.merge({k1: p('b')})) #=> {:k1=>"b"}
p(k1: p('a'), k1: p('b'))           #=> {:k1=>"b"}
p(k1: p('a'), **{k1: p('b')})       #=> {:k1=>"a"}
~~~

In 2nd and 4th cases, 'a' and 'b' will be printed. In 1st and 3rd cases, only 'b' will be printed. This behavior is inconsistent.

----------------------------------------
Bug #10315: Override policy for duplicated keywords
https://bugs.ruby-lang.org/issues/10315#change-49360

* Author: Koichi Sasada
* Status: Closed
* Priority: Normal
* Assignee: Yukihiro Matsumoto
* Category: core
* Target version: current: 2.2.0
* ruby -v: 2.2-2.0
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------

```ruby
p({k1: 'a', k1: 'b'})         #=> {:k1=>"b"}
p({k1: 'a'}.merge({k1: 'b'})) #=> {:k1=>"b"}
p(k1: 'a', k1: 'b')           #=> {:k1=>"b"}
p(k1: 'a', **{k1: 'b'})       #=> {:k1=>"a"}
```

IMO the last case should also output {:k1=>"b"}.

Nobu said that we should show warning for such duplication (especially for 1st and 3rd cases) because we can detect duplication while parsing/compiling.




-- 
https://bugs.ruby-lang.org/