为什么哈希转换为符号的字符串键?

时间:2016-04-09 07:27:29

标签: ruby string hash symbols literals

使用Ruby 2.3:

在示例1中,字符串键JSONObject jsnobject = new JSONObject(sb); 自动转换为符号,而在示例2中,它保持字符串。

示例1

"a"

示例2

{"a": 1}
# => {:a=>1} 

我认为{"a"=>"c"} # => {"a"=>"c"} 与旧式哈希火箭:语法相同。到底是怎么回事?为什么我在Rails中从未注意到这一点?是=>是否会掩盖这一点?

3 个答案:

答案 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)

根据Ruby documentation

  

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"