Ruby 散列是如何进行的’;让我们一个接一个地比较身份工作?

Ruby 散列是如何进行的’;让我们一个接一个地比较身份工作?,ruby,hash,Ruby,Hash,我首先运行了下面的第一部分代码并获得了所需的输出,现在只是为了解决这个问题并做一些研究,我做了第二部分 第一部分 第二部分 在第一部分和第二部分中,h1[“a”]如何给出不同的值,但在h1[:c]中却不一样 我使用的是Ruby 1.9.3。用户可以这样说: 使 HSH 按其身份比较其密钥,即将考虑与同一密钥完全相同的对象。 通常,哈希键将使用eql?进行匹配,但是compare\u by\u identity将使用equal?进行匹配(这大致相当于比较对象ids*)。由于具有相同值的字符串的不同

我首先运行了下面的第一部分代码并获得了所需的输出,现在只是为了解决这个问题并做一些研究,我做了第二部分

第一部分 第二部分 在第一部分和第二部分中,
h1[“a”]
如何给出不同的值,但在
h1[:c]
中却不一样

我使用的是Ruby 1.9.3。

用户可以这样说:

使<代码> HSH 按其身份比较其密钥,即将考虑与同一密钥完全相同的对象。

通常,哈希键将使用
eql?
进行匹配,但是
compare\u by\u identity
将使用
equal?
进行匹配(这大致相当于比较
对象id
s*)。由于具有相同值的字符串的不同实例具有不同的
object\u id
s,因此它不匹配。但是,符号始终具有相同的
对象id
,因此它会继续匹配

hash = { 'a' => 'str a', 'b' => 'str b', :c => 'sym c' }
hash.compare_by_identity

hash.keys.map(&:object_id)      #=> [70179407935200, 70179407935180, 358408]
['a', 'b', :c].map(&:object_id) #=> [70179405705480, 70179405705460, 358408]

hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:eql?) }   #=> [true, true, true]
hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:equal?) } #=> [false, false, true]

a_key = hash.keys.first  #=> 'a'
hash['a']   #=> nil
hash[a_key] #=> 'str a'
hash[:c]    #=> 'sym c'
如您所见,字符串的
object\u id
s与散列中键的
object\u id
s不匹配,但符号匹配。事实上,如果您反复运行
'a'.object\u id
&
'b'.object\u id
(或对任何字符串调用
object\u id
),每次都会得到不同的值

*这里需要注意的是,可以覆盖
object\u id
,但这对比较没有影响,因为
equal?
实际上没有使用
object\u id
。此外,重新定义
equal?
将改变这一点,但Ruby文档中不建议明确地这样做。

声明如下:

使<代码> HSH 按其身份比较其密钥,即将考虑与同一密钥完全相同的对象。

通常,哈希键将使用
eql?
进行匹配,但是
compare\u by\u identity
将使用
equal?
进行匹配(这大致相当于比较
对象id
s*)。由于具有相同值的字符串的不同实例具有不同的
object\u id
s,因此它不匹配。但是,符号始终具有相同的
对象id
,因此它会继续匹配

hash = { 'a' => 'str a', 'b' => 'str b', :c => 'sym c' }
hash.compare_by_identity

hash.keys.map(&:object_id)      #=> [70179407935200, 70179407935180, 358408]
['a', 'b', :c].map(&:object_id) #=> [70179405705480, 70179405705460, 358408]

hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:eql?) }   #=> [true, true, true]
hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:equal?) } #=> [false, false, true]

a_key = hash.keys.first  #=> 'a'
hash['a']   #=> nil
hash[a_key] #=> 'str a'
hash[:c]    #=> 'sym c'
如您所见,字符串的
object\u id
s与散列中键的
object\u id
s不匹配,但符号匹配。事实上,如果您反复运行
'a'.object\u id
&
'b'.object\u id
(或对任何字符串调用
object\u id
),每次都会得到不同的值


*这里需要注意的是,可以覆盖
object\u id
,但这对比较没有影响,因为
equal?
实际上没有使用
object\u id
。此外,重新定义
equal?
将改变这一点,但Ruby文档中并不明确建议这样做。

+1
感谢您的解释!我可以投赞成票吗?:)这是错误的<代码>哈希从不使用
=
表示相等。它使用
eql?
equal?
取决于
compare_by_identity
@JörgWMittag的设置。你是对的,我已经更新了我的答案以反映这一点,谢谢!我认为我的错误主要是太快地浏览了
Object#eql?
的文档,它显示它与
equal?
=
相同,并且错误地忽略了它们通常是单独重写的。@VBSlover对于这两个,它将
散列中的值与传递的数组配对,然后用该对调用
eql?
/
equal?
(在本例中,
map
也可以是
.map{a,b | a.eql?b}
,这可能更清楚)。最好查看生成的中间值(即查看
zip
调用返回的内容)
eql?
equal?
用于我在回答中给出的原因:“通常,哈希键将使用
eql?
进行匹配,但是
compare\u by\u identity
将使用
equal?
进行匹配,因此我比较了使用每一个的结果。@Viren我认为在字符串方面发生了一些特别的变化。我以后再查。
+1
谢谢你的解释!我可以投赞成票吗?:)这是错误的<代码>哈希
从不使用
=
表示相等。它使用
eql?
equal?
取决于
compare_by_identity
@JörgWMittag的设置。你是对的,我已经更新了我的答案以反映这一点,谢谢!我认为我的错误主要是太快地浏览了
Object#eql?
的文档,它显示它与
equal?
=
相同,并且错误地忽略了它们通常是单独重写的。@VBSlover对于这两个,它将
散列中的值与传递的数组配对,然后用该对调用
eql?
/
equal?
(在本例中,
map
也可以是
.map{a,b | a.eql?b}
,这可能更清楚)。最好查看生成的中间值(即查看
zip
调用返回的内容)
eql?
equal?
用于我在回答中给出的原因:“通常,哈希键将使用
eql?
进行匹配,但是
compare\u by\u identity
将使用
equal?
进行匹配,因此我比较了使用每一个的结果。@Viren我认为在字符串方面发生了一些特别的变化。我以后得调查一下。
hash = { 'a' => 'str a', 'b' => 'str b', :c => 'sym c' }
hash.compare_by_identity

hash.keys.map(&:object_id)      #=> [70179407935200, 70179407935180, 358408]
['a', 'b', :c].map(&:object_id) #=> [70179405705480, 70179405705460, 358408]

hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:eql?) }   #=> [true, true, true]
hash.keys.zip(['a', 'b', :c]).map { |pair| pair.inject(:equal?) } #=> [false, false, true]

a_key = hash.keys.first  #=> 'a'
hash['a']   #=> nil
hash[a_key] #=> 'str a'
hash[:c]    #=> 'sym c'