2016-10-21 7 views
3

Когда я делаю следующее:Как создать хэш со строковыми ключами по умолчанию

h = { "a": 123 } 

Рубин/Rails автоматически преобразует ключ к символу.

h[:a] # => 123 
h["a"] # => nil 

Как предотвратить такое поведение? Я создал хэш с помощью строкового ключа и хотел бы сохранить его таким образом, не имея при этом вызова Hash#stringify_keys.

+2

«key: value» - это просто ярлык для ': key => value', поэтому в вашем примере фактически нет строкового ключа -' 'a: 123' становится': "a" => 123' (обратите внимание на ведущий ':') – Stefan

+0

Может быть приятно, что если {"a": 123} использует HashWithIndifferentAccess под капотом, в отличие от хэша. – Joerg

+0

@Joerg: вы можете отправить запрос на функцию :) –

ответ

7

Использование хэш ракеты Синтаксис:

h = { "a" => 123 } 
#=> {"a"=>123} 
h['a'] 
#=> 123 
+1

Жаль ... такая уродливая нотация ... – Joerg

+0

@Joerg, как это было до появления новой хэш-записи. –

+0

Да, я знаю ... но с новой нотации - нет возврата :) – Joerg

1

Попробуйте

h = { "a" => 123 } 

Colon сделать ваш ключ символ.

+1

Жаль ... такое уродливая нотация ... :( – Joerg

1

Использование hashrocket вместо двоеточия :

h = { "a" => 123 } 
#=> {"a"=>123} 
1

Чтобы устранить недоразумение:

это заблуждение/разочарование, когда ключ строка изменяется, чтобы символ

Это WASN» t строка для начала. Это просто еще один синтаксис для создания символьных ключей. Рассмотрение:

:'foo-bar'.class # => Symbol 

Идея состоит в том, что иногда символы могут быть похожими на нечто совершенно иное.

Например, указанные без кавычек будут означать «создать буквальный символ :foo и от него, вычесть значение локального переменный/вызова метода результата bar». Раньше не было никакого способа построить такие символы, кроме как использовать String#to_sym. И вы должны согласиться, что это выглядит ужасно:

{'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'} 

Котировки вообще не означают создание строки, они означают берут как и/или определить границы для чего-то. Поэтому они, кстати, имеют большой смысл для строкового синтаксиса строки, но это не единственное их приложение.