映射到的值是什么?

时间:2012-01-04 08:53:39

标签: ruby hashmap

我不明白Ruby哈希是如何工作的。

我希望这些:

a = 'a'
{a => 1}[a] # => 1
{a: 1}[:a] # => 1
{2 => 1}[2] # => 1

这是如何运作的?

{'a' => 1}['a'] # => 1

第一个字符串'a'与第二个字符串'a'不是同一个对象。

3 个答案:

答案 0 :(得分:3)

Ruby不使用对象相等(equal?)来比较散列键。如果它毕竟没有用,那就没有用了。

相反,它使用eql?,其中字符串与==

相同

答案 1 :(得分:3)

作为其他答案的脚注,您可以让哈希表现得像您预期的那样:

h = {'a'=> 1}
p h['a'] #=> 1
h.compare_by_identity
p h['a'] #=> nil ; not the same object

答案 2 :(得分:1)

some_hash[k] = v

基本上,当您执行此操作时,存储的内容是直接关联k => v。取而代之的是,k会被要求提供hash code,然后用于映射到v

等值产生相等的哈希码。这就是为什么你的最后一个例子以它的方式工作的原因。

几个例子:

1.9.3p0 :001 > s = 'string'
 => "string" 
1.9.3p0 :002 > 'string'.hash 
 => -895223107629439507 
1.9.3p0 :003 > 'string'.hash == s.hash
 => true 
1.9.3p0 :004 > 2.hash
 => 2271355725836199018 
1.9.3p0 :005 > nil.hash
 => 2199521878082658865