Project

General

Profile

Actions

Bug #11501

closed

About priority of a hash element when using {**hash1, **hash2} literal

Added by studio3104 (Satoshi SUZUKI) over 6 years ago. Updated about 6 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
[ruby-dev:<unknown>]

Description

When creating a new hash using { **hash1, **hash2 } literal,
there are different behaviors between 2.2.0 or later and 2.1.7 or earlier like below.

  • ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]
  • ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
[1] pry(main)> hash1 = { duplicate_key: 1, key: 1 }
=> {:duplicate_key=>1, :key=>1}
[2] pry(main)> hash2 = { duplicate_key: 3 }
=> {:duplicate_key=>3}
[3] pry(main)> { **hash1, **hash2 }
=> {:duplicate_key=>3, :key=>1}
[4] pry(main)>
  • ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-darwin13.0]
[1] pry(main)> hash1 = { duplicate_key: 1, key: 1 }
=> {:duplicate_key=>1, :key=>1}
[2] pry(main)> hash2 = { duplicate_key: 3 }
=> {:duplicate_key=>3}
[3] pry(main)> { **hash1, **hash2 }
=> {:duplicate_key=>1, :key=>1}
[4] pry(main)>

It seems that the behavior has changed from 2.2.0, however there is no mention in any documents as far as I searched.

Is this intended change?
Please check this and give me a opinion.
Warm Regards.


Related issues

Related to Ruby master - Bug #10315: Override policy for duplicated keywordsClosedmatz (Yukihiro Matsumoto)10/02/2014Actions
Actions #1

Updated by studio3104 (Satoshi SUZUKI) over 6 years ago

  • Description updated (diff)
Actions #2

Updated by studio3104 (Satoshi SUZUKI) over 6 years ago

  • Description updated (diff)
Actions #3

Updated by studio3104 (Satoshi SUZUKI) over 6 years ago

  • Description updated (diff)
Actions #4

Updated by nagachika (Tomoyuki Chikanaga) over 6 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

Hello, satoshi san.
Thank you for your report.

I've checked the behaviors on each versions from 2.1.0-2.1.7, 2.2.0-2.2.4, and trunk(2.3-head).

script: hashes.rb

a = {a: 1, b: 2}
b = {a: 42}
p({ **a, **b })

results

→ for v in 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.2.0 2.2.1 2.2.2 2.2.3 2.3.0-dev; do rbenv shell $v; ruby -v hashes.rb; done
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin13.0]
{:a=>1, :b=>2}
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
{:a=>1, :b=>2}
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
{:a=>1, :b=>2}
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
{:a=>1, :b=>2}
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin13.0]
{:a=>1, :b=>2}
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
{:a=>1, :b=>2}
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]
{:a=>1, :b=>2}
ruby 2.1.7p400 (2015-08-18 revision 51632) [x86_64-darwin14.0]
{:a=>1, :b=>2}
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]
{:a=>42, :b=>2}
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
{:a=>42, :b=>2}
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
{:a=>42, :b=>2}
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
{:a=>42, :b=>2}
ruby 2.3.0dev (2015-10-07 trunk 52068) [x86_64-darwin14]
{:a=>42, :b=>2}

It seems that the behavior was changed between 2.1 <-> 2.2 series.
I don't known its intended or not.
In my personal opinion, I feel the latter (behavior of 2.2, 2.3) is reasonable because it's consistent with Hash#merge.

If matz admit this change, I'd like to add "Hash's incompatible changes" section in NEWS file on ruby_2_2 branch.

Actions #5

Updated by wanabe (_ wanabe) over 6 years ago

git bisect shows the change was introduced by #10315.
I guess it is intended.

Actions #6

Updated by wanabe (_ wanabe) over 6 years ago

  • Related to Bug #10315: Override policy for duplicated keywords added
Actions #7

Updated by wanabe (_ wanabe) over 6 years ago

Oops, many revisions references #10315.
Sorry, r47878 is the revision.

Updated by nagachika (Tomoyuki Chikanaga) about 6 years ago

  • Assignee changed from matz (Yukihiro Matsumoto) to nagachika (Tomoyuki Chikanaga)
  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED

wanabe san, thank you for your investigation!

According to #10315, It's intentional change.
I'll add comment for it in NEWS in ruby_2_2 and doc/NEWS-2.2.0 in trunk.

Actions #9

Updated by nagachika (Tomoyuki Chikanaga) about 6 years ago

  • Status changed from Assigned to Closed

Applied in changeset r53050.


  • doc/NEWS-0.2.2: add description about incompatible change in Hash duplicated key overriding policy. [Bug #10315] [Bug #11501]

Updated by nagachika (Tomoyuki Chikanaga) about 6 years ago

  • Backport changed from 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONE

Add description to NEWS about this on ruby_2_2 branch (I committed in doc/NEWS-2.2.0 on trunk and backport it) at r53051.

Actions

Also available in: Atom PDF