使用符号键和字符串键引用哈希元素

时间:2016-03-01 02:13:20

标签: ruby string hash symbols

为什么ruby不允许您明确地使用字符串或符号引用元素?这通常会让我感到困惑,特别是在处理JSON时。做

hash = {stat: bar}

允许hash[:stat]引用。后来,如果我这样做了:

hash = JSON.parse(hash.to_json)
hash[:stat]

将返回nil,而我必须hash['stat']。这是为什么?这是故意的,如果是的话,为什么?

3 个答案:

答案 0 :(得分:4)

哈希将关键对象映射到值对象。如果将值对象与键对象关联,则可以通过该键对象检索它。如果将值与不同的键对象关​​联,则可以通过该不同的键对象检索它。传递一个关键对象并获取不同关键对象的值是完全错误的。

例如,使用以下哈希:

hsh = {:foo => 42, 'foo' => 23, [:foo] => :bar, ['foo'] => :baz}

如果Ruby刚刚开始为完全不同的密钥返回值,您将如何检索4223

答案 1 :(得分:3)

JSON没有符号。对于属性名称,它只有字符串。当您将键/值对序列化为JSON对象时,您将丢失有关该键是否以字符串或符号开始生命的任何信息,该键只是一个字符串。当您将对象反序列化为Ruby数据结构时,唯一合理的选择是使用字符串作为键。

答案 2 :(得分:-2)

将符号解析为json的字符串,但解析为hash的json会将其视为字符串。如果你要两种方式使用它,最好冻结字符串而不是使用符号。