`:key =>之间有什么区别吗? “value”`和`key:“value”`哈希符号?

时间:2011-12-30 01:09:15

标签: ruby syntax hash ruby-1.9 hashrocket

:key => "value"(hashrocket)和key: "value"(Ruby 1.9)符号之间有什么区别吗?

如果没有,那么我想使用key: "value"符号。是否有宝石可以帮助我从:x =>转换为x:符号?

5 个答案:

答案 0 :(得分:145)

是的,有区别。这些是合法的:

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

但这些不是:

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

您还可以将任何内容用作=>的密钥,以便您可以执行此操作:

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

但你不能这样做:

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

JavaScript样式(key: value)仅在所有哈希键都是“简单”符号(或多或少匹配/\A[a-z_]\w*\z/i的情况下有用,AFAIK解析器使用其标签模式来表示这些键)。

使用MongoDB时,:$in样式符号会显示相当一致,因此如果使用MongoDB,最终会混合使用哈希样式。而且,如果你使用哈希(h[:k])的特定键而不是整个哈希(h = { ... }),你仍然必须使用冒号优先的符号样式;你还必须使用前导冒号样式来表示你在哈希之外使用的符号。我更喜欢保持一致,所以我根本不打算使用JavaScript风格。

在Ruby 2.2中修复了JavaScript风格的一些问题。如果您的符号不是有效标签,则现在可以使用引号,例如:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

但如果你的钥匙不是符号,你仍然需要使用hashrocket。

答案 1 :(得分:10)

key: "value"是Ruby 1.9的便利功能;只要你知道你的环境会支持它,我认为没有理由不使用它。键入冒号比使用火箭更容易,我觉得它看起来更干净。至于有一个宝石可以进行转换,可能不是,但如果您还不知道文件操作和正则表达式,它似乎是一个理想的学习体验。

答案 2 :(得分:4)

key: value JSON样式的赋值是新的Ruby 1.9哈希语法的一部分,因此请记住,此语法不适用于旧版本的Ruby。此外,键将成为符号。如果你能忍受这两个限制,那么新的哈希就像旧的哈希一样;没有理由(除了风格,也许)转换它们。

答案 3 :(得分:3)

哈希火箭分配的Ruby哈希密钥可以促进键值对的字符串(例如's' => x),而通过符号进行密钥分配(< em>例如 key: "value":key => "value"无法分配字符串。尽管hash-rockets为哈希表提供了自由和功能,但特别允许字符串作为键,应用程序性能可能比使用符号作为哈希键构造哈希表时要慢。以下资源可能能够澄清hashrockets和符号之间的任何差异:

答案 4 :(得分:1)

执行@Transient与执行:key => value相同,实际上只是方便。我还没有看到其他使用key: value的语言,但其他像Javascript的人在其Hash等效数据类型中使用=>

至于改变你写出哈希的方式的宝石,我会坚持你为当前项目做的方式。

*请注意,在使用key: value时,密钥将是一个符号,并且在key: value哈希中访问存储在该密钥中的值仍为foo