ruby - элемент - Почему этот строковый ключ в хэше преобразуется в символ?




символы ruby (2)

Использование Ruby 2.3:

В примере 1 строковый ключ "a" автоматически преобразуется в символ, тогда как в примере 2 он остается строкой.

Пример 1

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

Пример 2

{"a"=>"c"}
# => {"a"=>"c"}

Я подумал : был такой же, как в старом стиле синтаксис хэш-ракеты => . Что здесь происходит? Почему я никогда не замечал этого в Rails? Это HashWithIndifferentAccess который HashWithIndifferentAccess это?


В Ruby 2.3 (.0) все они одинаковы:

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

Все они означают одно и то же: во всех этих случаях символ является символом.

{"a"=>1} отличается: a является строкой в ​​этом случае.


Согласно документации Ruby :

Blockquote Объекты Symbol представляют имена и некоторые строки внутри интерпретатора Ruby. Они генерируются с использованием синтаксиса литералов: name и: "string" и с помощью различных методов to_sym. [...]

Это означает, что работает:

$ 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"

Будет давать тот же результат:

$ {:key=>"value"}




literals