我不明白Ruby哈希是如何工作的。
我希望这些:
a = 'a'
{a => 1}[a] # => 1
{a: 1}[:a] # => 1
{2 => 1}[2] # => 1
这是如何运作的?
{'a' => 1}['a'] # => 1
第一个字符串'a'
与第二个字符串'a'
不是同一个对象。
答案 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