129

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

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

4

5 回答 5

157

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

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) 仅在您的所有 Hash 键都是“简单”符号(或多或少匹配的东西/\A[a-z_]\w*\z/i,AFAIK 解析器对这些键使用其标签模式)时才有用。

使用 MongoDB 时,:$in样式符号会出现很多,因此如果您使用 MongoDB,您最终会混合 Hash 样式。而且,如果您曾经使用哈希 ( ) 的特定键,h[:k]而不仅仅是整个哈希 ( h = { ... }),您仍然必须使用冒号优先的符号样式;对于在哈希之外使用的符号,您还必须使用前导冒号样式。我更喜欢保持一致,所以我根本不关心 JavaScript 样式。

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

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

但是,如果您的密钥不是符号,您仍然需要哈希火箭。

于 2011-12-30T01:30:17.307 回答
11

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

于 2011-12-30T01:14:27.783 回答
6

由 hash-rockets 分配的 Ruby 哈希键可以促进键值对(例如. 's' => x)的字符串,而通过符号例如 key: "value"or :key => "value")分配的键不能与字符串一起分配。 尽管哈希火箭为哈希表提供了自由和功能,特别是允许字符串作为键,但应用程序性能可能比使用符号作为哈希键构建哈希表时要慢。以下资源可能能够阐明哈希火箭和符号之间的任何区别:

于 2016-02-20T18:58:42.100 回答
4

JSON 样式的key: value赋值是新的 Ruby 1.9 哈希语法的一部分,所以请记住,这种语法不适用于旧版本的 Ruby。此外,键将是符号。如果你能忍受这两个约束,新的哈希值就像旧的哈希值一样工作;没有理由(也许除了风格)来转换它们。

于 2011-12-30T01:12:42.990 回答
1

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

至于转换您写出哈希值的方式的 gem,我会坚持您为当前项目所做的方式。

*请注意,使用key: value该键将是一个符号,并且要访问存储在该键处的foo哈希值仍然是foo[:key].

于 2015-07-23T20:58:06.047 回答