首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >`:key => "value"`和`key:"value"`散列符号有什么区别吗?

`:key => "value"`和`key:"value"`散列符号有什么区别吗?
EN

Stack Overflow用户
提问于 2011-12-30 09:09:15
回答 4查看 27.5K关注 0票数 127

:key => "value" (hashrocket)和key: "value" (Ruby1.9)符号有什么不同吗?

如果不是,那么我想使用key: "value"表示法。有没有能帮助我从:x =>转换成x:符号的gem?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-30 09:30:17

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

代码语言:javascript
复制
h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

但这些不是:

代码语言:javascript
复制
h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

您还可以在=>中使用任何内容作为键,因此可以执行以下操作:

代码语言:javascript
复制
h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

但你不能这样做:

代码语言:javascript
复制
h = { C.new: 11 }
h = { 23: 'pancakes house?' }

只有当你所有的哈希键都是“简单”符号时,JavaScript样式(key: value)才有用(或多或少与/\A[a-z_]\w*\z/i匹配的东西解析器对这些键使用它的标签模式)。

在使用MongoDB时,散列样式的符号显示得比较多,所以如果使用MongoDB,最终会混合使用:$in样式。而且,如果您曾经使用特定的散列键(h[:k])而不仅仅是整个散列(h = { ... }),那么对于符号,仍然必须使用冒号优先样式;对于在散列之外使用的符号,也必须使用前导冒号样式。我更喜欢保持一致,所以我根本不会为JavaScript风格而烦恼。

JavaScript风格的一些问题已经在Ruby2.2中得到了修复。现在,如果符号不是有效的标签,则可以使用引号,例如:

代码语言:javascript
复制
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

但是如果你的key不是符号,你仍然需要hashrocket。

票数 156
EN

Stack Overflow用户

发布于 2011-12-30 09:14:28

key: "value"是Ruby1.9的一个便利特性;只要您知道您的环境将支持它,我就认为没有理由不使用它。只是输入一个冒号要比输入一个火箭容易得多,而且我认为它看起来更干净。如果你还不了解文件操作和正则表达式,那么对于你来说,这似乎是一个理想的学习体验。

票数 11
EN

Stack Overflow用户

发布于 2011-12-30 09:12:43

Ruby风格的赋值是新的Ruby1.9散列语法的一部分,因此请记住,这种语法不适用于旧版本的key: value。此外,关键字将是符号。如果您可以接受这两个约束,那么新的哈希的工作方式就像旧的哈希一样;没有理由(也许除了样式之外)转换它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8675206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档