Почему рубин не позволяет однозначно ссылаться на элемент с помощью строки или символа? Это часто меня укусило, особенно при работе с JSON. Делать

hash = {stat: bar}

Позволяет ссылаться на hash[:stat]. Позже, если бы я сделал это:

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

Это вернет nil, а вместо этого мне придется сделать hash['stat']. Почему это? Было ли это намеренно, и если да, то почему?

0
dude0faw3 1 Мар 2016 в 05:13

3 ответа

Лучший ответ

В JSON нет символов. Для имен свойств есть только строки. Когда вы сериализуете пару ключ / значение в объект JSON, вы теряете любую информацию о том, начал ли ключ жизнь как строку или символ, ключ - это просто строка. Когда вы десериализуете объект обратно в структуру данных Ruby, единственный разумный выбор - использовать строки для ключей.

3
meagar 1 Мар 2016 в 02:21

Символ анализируется как строка для json, но json, проанализированный до хэша, увидит его как строку. Если вы собираетесь использовать это в обоих направлениях, лучше заморозить строку вместо использования символов.

-2
cevado 1 Мар 2016 в 02:19

Хэш сопоставляет ключевые объекты с объектами значений. Если вы связываете объект значения с ключевым объектом, вы можете получить его через этот ключевой объект. Если вы связываете значение с другим ключевым объектом, вы можете получить его через этот другой ключевой объект. Передача одного ключевого объекта и получение значения другого ключевого объекта просто неверно.

Возьмем, например, следующий хеш:

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

Как бы вы получили 42 или 23, если бы Ruby просто волей-неволей начал возвращать значения для совершенно разных ключей?

4
Jörg W Mittag 1 Мар 2016 в 02:32