为什么ruby不允许您明确地使用字符串或符号引用元素?这通常会让我感到困惑,特别是在处理JSON时。做
hash = {stat: bar}
允许hash[:stat]
引用。后来,如果我这样做了:
hash = JSON.parse(hash.to_json)
hash[:stat]
将返回nil
,而我必须hash['stat']
。这是为什么?这是故意的,如果是的话,为什么?
答案 0 :(得分:4)
哈希将关键对象映射到值对象。如果将值对象与键对象关联,则可以通过该键对象检索它。如果将值与不同的键对象关联,则可以通过该不同的键对象检索它。传递一个关键对象并获取不同关键对象的值是完全错误的。
例如,使用以下哈希:
hsh = {:foo => 42, 'foo' => 23, [:foo] => :bar, ['foo'] => :baz}
如果Ruby刚刚开始为完全不同的密钥返回值,您将如何检索42
或23
?
答案 1 :(得分:3)
JSON没有符号。对于属性名称,它只有字符串。当您将键/值对序列化为JSON对象时,您将丢失有关该键是否以字符串或符号开始生命的任何信息,该键只是一个字符串。当您将对象反序列化为Ruby数据结构时,唯一合理的选择是使用字符串作为键。
答案 2 :(得分:-2)
将符号解析为json的字符串,但解析为hash的json会将其视为字符串。如果你要两种方式使用它,最好冻结字符串而不是使用符号。