From: eregontp@... Date: 2016-10-20T17:29:12+00:00 Subject: [ruby-core:77688] [Ruby trunk Bug#12855] Inconsistent keys identity in compare_by_identity Hash when using literals Issue #12855 has been updated by Benoit Daloze. Jeremy Evans wrote: > While this was a behavior change between 2.1 and 2.2, I'm not sure I would consider it a regression. > It seems unlikely anyone who uses compare_by_identity hashes would also be using string literals and want string literals keys to have different values. The main reason I consider it a bug is that it contradicts the very basic intuition that replacing a literal with an expression producing it has identical behavior. For example, `"z = #{3*4}"` vs `r = 12; "z = #{r}"`. While of course a much smaller area of exposition, I think there is no reason to introduce this change (and I'm fairly confident it was not intended). ---------------------------------------- Bug #12855: Inconsistent keys identity in compare_by_identity Hash when using literals https://bugs.ruby-lang.org/issues/12855#change-60970 * Author: Benoit Daloze * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- This seems a regression since 2.2. I would guess it's due to some optimization for having a string literal between []=. That optimization should not trigger for compare_by_identity hashes, so both cases below are consistent. ~~~ruby h = {}.compare_by_identity h['pear'] = 1 h['pear'] = 2 p h.size # => 1 p h h = {}.compare_by_identity k1 = 'pear' h[k1] = 1 k2 = 'pear' h[k2] = 2 p h.size # => 2 p h ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: