‘ : key = > “ value”和‘ key: “ value”’散列表示法有什么区别吗?

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

如果没有,那么我想使用 key: "value"表示法。有没有一个宝石,帮助我转换从 :x =>x:符号?

29990 次浏览

key: value JSON 风格的分配是新的 Ruby 1.9散列语法的一部分,因此请记住,这种语法不适用于旧版本的 Ruby。还有,钥匙是符号。如果您可以忍受这两个约束,那么新散列的工作方式就像旧散列一样; 没有理由(也许除了样式之外)转换它们。

key: "value"是 Ruby 1.9的一个便利特性; 只要你知道你的环境会支持它,我看没有理由不使用它。输入冒号比输入火箭要容易得多,而且我认为它看起来干净得多。至于有一个 gem 来做转换,可能不会,但它似乎是一个理想的学习经验为您,如果你不知道文件操作和正则表达式。

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

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)只有在所有的 Hash 键都是“简单”符号(或多或少与 /\A[a-z_]\w*\z/i匹配,解析器对这些键使用其标签模式的 AFAIK)时才有用。

使用 MongoDB 时,:$in样式符号会显示出来,所以如果使用 MongoDB,最终会混合使用哈希样式。而且,如果你曾经使用过特定的 Hash 键(h[:k])而不仅仅是整个 Hash 键(h = { ... }) ,你仍然必须使用冒号优先的符号样式; 你还必须使用前导冒号样式的符号,你使用外面的 Hash。我更喜欢保持一致性,这样我就根本不用为 JavaScript 样式操心了。

JavaScript 风格的一些问题在 Ruby 2.2中已经得到解决。现在,如果有无效标签的符号,可以使用引号,例如:

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

但是如果你的钥匙不是符号,你仍然需要散列火箭。

:key => value和做 key: value是一样的,实际上只是一种方便。我还没有看到其他语言使用 =>,但是像 Javascript 这样的语言在它们的 Hash 等效数据类型中使用 key: value

至于转换您编写哈希表的方式的 gem,我将坚持您在当前项目中的方式。

* 注意,在使用 key: value时,键将是一个符号,并且要访问在 foo散列中存储在该键的值仍将是 foo[:key]

哈希火箭分配的 Ruby 哈希键可以简化键值对的字符串(例如:'s' => x) ,而密钥分配通过 符号(例如:。 key: "value":key => "value") 不能与字符串一起分配。虽然哈希火箭提供自由和功能的哈希表,特别允许字符串作为键,应用程序的性能可能会慢于如果哈希表是用符号作为哈希键构造。下列资源可能能够澄清散列火箭和符号之间的任何区别: