使用Ruby 2.3:
在示例1中,字符串键JSONObject jsnobject = new JSONObject(sb);
自动转换为符号,而在示例2中,它保持字符串。
示例1
"a"
示例2
{"a": 1}
# => {:a=>1}
我认为{"a"=>"c"}
# => {"a"=>"c"}
与旧式哈希火箭:
语法相同。到底是怎么回事?为什么我在Rails中从未注意到这一点?是=>
是否会掩盖这一点?
答案 0 :(得分:30)
在Ruby 2.3(.0)中,这些都是相同的:
{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1}
它们都转化为同一个东西:a
在所有这些情况下都是符号。
{"a"=>1}
不同:a
在这种情况下是一个字符串。
答案 1 :(得分:6)
这是因为ruby 1.9引入了新的哈希语法。带冒号的语法仅适用于符号键。它被称为"符号对象"哈希,它是最常见的哈希风格的唯一语法糖。对我来说另一点,它更接近javascript对象表示法。
如果我有混合键类型,那么我更喜欢旧样式(哈希火箭语法),但这取决于你。混合这两种风格看起来很难看。
答案 2 :(得分:1)
Blockquote Symbol对象表示Ruby解释器中的名称和一些字符串。它们是使用:name和:" string"生成的。文字语法,以及各种to_sym方法。 [...]
这意味着运行:
class Matrix(object):
def inverse(self):
# ....
# not: return inverse
return Matrix(inverse)
def T(self):
# ...
# not: return matrix_transpose
return Matrix(matrix_transpose)
会产生相同的结果:
$ ruby -e ruby -e "h = {key: \"value\"}; puts h"
$ ruby -e ruby -e "h = {:key => \"value\"}; puts h"
$ ruby -e ruby -e "h = {\"key\": \"value\"}; puts h"
$ ruby -e ruby -e "h = {:\"key\" => \"value\"}; puts h"
$ ruby -e ruby -e "h = {\"#{:key}\": \"value\"}; puts h"