“: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 => valuekey: value是一样的,真​​的只是一个方便。 我还没有看到使用=>其他语言,但是其他像JavaScript这样的语言在他们的Hash等价数据types中使用key: value

至于转换你写出散列的方式的gem,我会坚持你正在为你当前的项目做的方式。

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

    Interesting Posts