Answers:
是,有一点不同。这些是合法的:
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[:s] = 42
示例与这个问题有关?在我看来,JavaScript样式与hashrocket样式仅与哈希键/值对定义有关,而与通过键寻址哈希元素无关。因此,该h[s:] = 42
示例似乎具有误导性。
h[:s] = 42
符号。没有其他选择。在定义键/值对时,您可以选择{ key: value }
JavaScript样式或{ :key => value }
hashrocket样式。解决方案似乎仍然与所关注的内容无关。
由散列火箭分配红宝石散列密钥可以促进为键-值对的字符串(例如,'s' => x
经由而键分配)符号(例如, key: "value"
或:key => "value"
)不能与串分配。 尽管哈希火箭为哈希表提供了自由和功能,特别是允许使用字符串作为键,但是与使用符号作为哈希键构造哈希表相比,应用程序的性能可能会更慢。以下资源可能能够阐明哈希火箭和符号之间的任何区别:
做:key => value
与做相同key: value
,实际上只是一种便利。我还没有看到其他使用的语言=>
,但是像Javascript这样的其他语言key: value
在其Hash等效数据类型中使用。
至于宝石可以转换您编写散列的方式,我只是坚持使用当前项目的方式。
*请注意,在使用key: value
键时将使用符号,而在foo
哈希中访问该键所存储的值仍为foo[:key]
。
=>
。我猜想Ruby在Perl的启发下,从Perl借来了语法:)
h = { 'a.b': 'c' }
从Ruby 2.2.0开始现在是合法的。参见bugs.ruby-lang.org/issues/4276