0

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

但我不知道hash2 = Hash[:a => 100 , :b => 200]是什么。

键之间有什么区别?带钥匙有什么用:

4

3 回答 3

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".

延伸阅读

于 2013-08-20T06:50:24.147 回答
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}

..如果您使用符号。

有关符号与字符串的更多信息。

于 2013-08-20T06:52:47.947 回答
0

添加到@Yu Hao的答案。hash1[:a] 与 hash1["a"] 不同:string 是符号,"string" 是常规的 ruby​​ 字符串。Symbol 是不可变的,并且在某些情况下可能比 String(在 Ruby 中是可变的)表现更好。您可以阅读有关symbol 和 string 之间区别的更多信息。

于 2013-08-20T06:49:58.577 回答