Project

General

Profile

Bug #10315

Override policy for duplicated keywords

Added by ko1 (Koichi Sasada) over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
2.2-2.0
[ruby-core:65368]

Description

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.


Related issues

Related to Ruby master - Bug #11501: About priority of a hash element when using {**hash1, **hash2} literalClosednagachika (Tomoyuki Chikanaga)Actions

Updated by nobu (Nobuyoshi Nakada) over 5 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

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]

Updated by whitequark (whitequark *) over 5 years ago

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.

#4

Updated by wanabe (_ wanabe) over 4 years ago

  • Related to Bug #11501: About priority of a hash element when using {**hash1, **hash2} literal added

Also available in: Atom PDF