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


124

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

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

Answers:


153

是,有一点不同。这些是合法的:

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解析器对这些键使用其标签模式)时才有用。

:$in使用MongoDB时,样式符号显示得相当不错,因此如果使用MongoDB,最终将混合使用Hash样式。而且,如果您曾经使用过特定的哈希键(h[:k])而不是整个哈希(h = { ... }),则仍必须对符号使用冒号优先样式;您还必须对在哈希之外使用的符号使用前导冒号样式。我更喜欢保持一致,因此我完全不用理会JavaScript样式。

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

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

但是,如果您的密钥不是符号,那么您仍然需要使用hashrocket。


h = { 'a.b': 'c' }从Ruby 2.2.0开始现在是合法的。参见bugs.ruby-lang.org/issues/4276
B

@BSeven:谢谢,我不久前更新了我的另一个大问题,但错过了这个答案
亩太短了

为什么您觉得h[:s] = 42示例与这个问题有关?在我看来,JavaScript样式与hashrocket样式仅与哈希键/值对定义有关,而与通过键寻址哈希元素无关。因此,该h[s:] = 42示例似乎具有误导性。
Nic Nilov

@NicNilov这很重要,因为JavaScript样式与符号有关,因为哈希键和允许的符号令人困惑地取决于上下文。
亩太短了

不能同意。通过符号寻址哈希槽时,请始终使用h[:s] = 42符号。没有其他选择。在定义键/值对时,您可以选择{ key: value }JavaScript样式或{ :key => value }hashrocket样式。解决方案似乎仍然与所关注的内容无关。
Nic Nilov

11

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


5

由散列火箭分配红宝石散列密钥可以促进为键-值对的字符串(例如's' => x经由而键分配)符号例如, key: "value":key => "value"不能与串分配。 尽管哈希火箭为哈希表提供了自由和功能,特别是允许使用字符串作为键,但是与使用符号作为哈希键构造哈希表相比,应用程序的性能可能会更慢。以下资源可能能够阐明哈希火箭和符号之间的任何区别:


4

key: valueJSON风格的任务是新的Ruby 1.9哈希语法的一部分,所以要记住,这句法不会与旧版本的Ruby的工作。同样,键将成为符号。如果您可以忍受这两个约束,那么新的散列就像旧的散列一样起作用。没有任何理由(也许是风格)来转换它们。


5
PS:它不是 JSON样式,而是JavaScript样式。JSON要求将引号引起来。
亩太短

1

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

至于宝石可以转换您编写散列的方式,我只是坚持使用当前项目的方式。

*请注意,在使用key: value键时将使用符号,而在foo哈希中访问该键所存储的值仍为foo[:key]


Perl和PHP都使用=>。我猜想Ruby在Perl的启发下,从Perl借来了语法:)
Daniel Serodio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.