带有“:”的哈希键有啥用[重复]
Posted
技术标签:
【中文标题】带有“:”的哈希键有啥用[重复]【英文标题】:What is the use of a hash key with ":" [duplicate]带有“:”的哈希键有什么用[重复] 【发布时间】:2013-08-22 02:49:33 【问题描述】:我了解哈希:hash1 = Hash["a" => 100 , "b" => 200]
但我不知道hash2 = Hash[:a => 100 , :b => 200]
是什么。
这两个键有什么区别?带:
的密钥有什么用?
【问题讨论】:
【参考方案1】:符号和字符串都可以用作哈希键。以:
开头的键是符号。
符号是不可变的(不能更改)并且在内存中只存在一次:
: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】::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"
互换。
进一步阅读
Why use symbols as hash keys? 13 Ways of Looking at a Ruby symbol The Difference Between Ruby Symbols and Strings【讨论】:
【参考方案3】:添加到@Yu Hao的答案。 hash1[:a] 与 hash1["a"] 不同:string 是符号,"string" 是常规的 ruby 字符串。 Symbol 是不可变的,并且在某些情况下可能比 String(在 Ruby 中是可变的)表现更好。你可以阅读更多关于difference between symbol and string的信息。
【讨论】:
以上是关于带有“:”的哈希键有啥用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
TLS/SSL数字证书里的指纹算法、签名算法和签名哈希算法各是做啥用的