“:key =>”value“`和`key:”value“`hashexpression式有什么不同?
是否有任何区别:key => "value"
(hashrocket)和key: "value"
(Ruby 1.9)符号?
如果没有,那么我想用key: "value"
符号。 有没有一个gem,可以帮助我从:x =>
转换为x:
notations?
是的,有一个区别。 这些是合法的:
h = { :$in => array } h = { :'ab' => '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键都是“简单”符号(或多或less与/\A[a-z_]\w\z/i
相匹配的情况下才有用,parsing器使用它的标签这些键的模式)。
在使用MongoDB的时候, :$in
style样式的符号显示得相当不错,所以如果你使用MongoDB,你最终会混合使用Hash样式。 而且,如果您曾经使用过Hashes( h[:k]
)的特定键而不是整个哈希( h = { ... }
),那么您仍然必须使用冒号优先方式作为符号; 您还必须使用引号分隔样式来表示您在哈希之外使用的符号。 我更喜欢一致,所以我根本不打扰JavaScript风格。
一些JavaScript风格的问题已经在Ruby 2.2中解决了。 如果您的符号不是有效的标签,现在可以使用引号,例如:
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }
但是如果你的钥匙不是符号的话,你还是需要这个哈克斯。
key: "value"
是Ruby 1.9的一个方便function; 只要你知道你的环境会支持它,我没有理由不使用它。 键入一个冒号比火箭要容易得多,我觉得它看起来更干净。 至于做转换的gem,可能不是,但是如果你还不知道文件操作和正则expression式的话,对你来说这似乎是一个理想的学习体验。
key: value
JSON风格的分配是新的Ruby 1.9哈希语法的一部分,所以请记住,这种语法不适用于旧版本的Ruby。 此外,键将是符号。 如果你能忍受这两个限制,新的哈希就像旧哈希一样工作。 (除了风格,也许)没有任何理由来转换它们。
由散列火箭分配的Ruby散列键可以促进键值对的string( 例如 's' => x
),而通过符号 ( 例如 key: "value"
或:key => "value"
) 进行的键分配不能分配string。 尽pipe散列火箭提供了散列表的自由度和function性, 特别是允许string作为关键字 ,但是应用程序的性能可能比散列表被构造为带有符号的散列键更慢。 以下资源可能能够澄清hashrockets和符号之间的任何差异:
- 瑞安索博尔在Ruby中的符号
- ruby散热由Erik Trautman展现
做:key => value
和key: value
是一样的,真的只是一个方便。 我还没有看到使用=>
其他语言,但是其他像JavaScript这样的语言在他们的Hash等价数据types中使用key: value
。
至于转换你写出散列的方式的gem,我会坚持你正在为你当前的项目做的方式。
*注意,在使用key: value
,键将是一个符号,并且在foo
散列中访问存储在该键处的值仍将是foo[:key]
。