使用“:”的哈希键有什么用?

时间:2013-08-20 06:38:49

标签: ruby

我理解哈希:hash1 = Hash["a" => 100 , "b" => 200]

但我无法弄清hash2 = Hash[:a => 100 , :b => 200]是什么。

键之间有什么区别?密钥与:的用途是什么?

3 个答案:

答案 0 :(得分:4)

:a是一个符号,而"a"是一个字符串。

:a == "a"
# => false

:a.to_s
# => "a"

因此,给出以下哈希值,

h1 = Hash["a" => 100, "b" => 200]
h2 = Hash[:a => 100, :b => 200]

我们可以按如下方式访问他们的值

h1[:a]
# => nil
h1["a"]
# => 100

h2[:a]
# => 100
h2["a"]
# => nil

ActiveSupport的HashWithIndifferentAccess允许互换:a"a"

进一步阅读

答案 1 :(得分:4)

符号和字符串都可以用作哈希键。以:开头的键是符号。

符号是不可变的(它们不能被更改)并且只在内存中存在一次:

:foo.object_id == :foo.object_id    #=> true
'foo'.object_id == 'foo'.object_id  #=> false

每次在Ruby中使用字符串时,它都会创建一个新对象,但对于符号则不然。出于这个原因,它们经常在Ruby中用作哈希键。令人高兴的是,他们也是一个比字符串更短的字符。

符号在ruby中的散列键很常见,因为ruby 1.9引入了一种浓缩语法,尤其是使用符号作为键。

hash2 = Hash[:a => 100 , :b => 200]

也可写:

hash2 = Hash[a: 100, b: 200]

或者更常见的是:

hash2 = {a: 100, b: 200}

..如果您使用的是符号。

有关symbols vs strings的更多信息。

答案 2 :(得分:0)

加入@Yu Hao的回答。 hash1 [:a]与hash1 [“a”]不同:string是symbol,“string”是常规ruby字符串。符号是不可变的,并且在某些情况下与String相比可能表现更好(在Ruby中是可变的)。您可以阅读有关difference between symbol and string的更多信息。