我有三个哈希:
a = {key:"value"}
b = {"key"=>"value"}
c = {:key=>"value"}
这些结果:
a.has_key?("key") # => false
b.has_key?("key") # => true
c.has_key?("key") # => false
我的问题是:
a
,b
和c
使用相同的语法返回true
?答案 0 :(得分:15)
有字符串,有符号。字符串不是符号。
这些哈希包含一个符号作为键:
{key: "value"}
{:key => "value"}
此哈希包含一个字符串作为键:
{"key"=>"value"}
这就是为什么你的测试表现得像他们一样。
Rails有一个Hash包装器,名为HashWithIndifferentAccess。如果您有其中一个,则可以通过字符串或符号访问值。但对于常规哈希,有区别。
require "active_support/core_ext"
h = {key: "value"}.with_indifferent_access
h.has_key?(:key) # => true
h.has_key?("key") # => true
答案 1 :(得分:2)
如果你在分配哈希时观察,在IRB中他们就是这样:
2.0.0p247 :014 > a = {key:"values"}
=> {:key=>"values"}
2.0.0p247 :015 > b = {"key" => "values"}
=> {"key"=>"values"}
2.0.0p247 :016 > c = {:key => "value"}
=> {:key=>"value"}
除了用于分配的语法之外,我们可以看到a
和c
是相同的。用于c
的语法是我猜的旧语法。
a = {key:"values"}
是最新Ruby版本中引入的语法。在哈希a
和c
中,键是a
符号。
“The Difference Between Ruby Symbols and Strings”解释了字符串和符号之间的区别,
而在散列b
中,键值是一个字符串。显然它的价值是“关键”。主要区别在于散列b
的键值是可变的,而在散列a
的情况下它不是真的。
答案 2 :(得分:0)
您应该使用符号:key
进行哈希a
和c
。
a = {key: "value"}
b = {"key" => "value"}
c = {:key => "value"}
a.has_key? :key # => true
b.has_key? :key # => false
c.has_key? :key # => true
{key:"value"}
相当于{:key=>"value"}
。