Есть ли разница между обозначениями :key => "value"
(hashrocket) и key: "value"
(Ruby 1.9)?
Если нет, то я хотел бы использовать обозначение key: "value"
. Есть ли камень, который помогает мне конвертировать из :x =>
в x:
нотации?
Есть ли разница между обозначениями :key => "value"
(hashrocket) и key: "value"
(Ruby 1.9)?
Если нет, то я хотел бы использовать обозначение key: "value"
. Есть ли камень, который помогает мне конвертировать из :x =>
в x:
нотации?
Да, есть разница. Это законно:
h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42
но это не так:
h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42
Вы также можете использовать что-либо в качестве ключа с помощью =>
, чтобы вы могли сделать это:
h = { C.new => 11 }
h = { 23 => 'pancakes house?' }
но вы не можете этого сделать:
h = { C.new: 11 }
h = { 23: 'pancakes house?' }
Стиль JavaScript (key: value
) полезен только в том случае, если все ваши хэш-символы являются "простыми" символами (более или менее чем-то, что соответствует /\A[a-z_]\w*\z/i
, AFAIK анализатор использует свой шаблон ярлыка для этих клавиш).
Символы стиля :$in
отображают справедливый бит при использовании MongoDB, поэтому вы будете смешивать стили Hash, если используете MongoDB. И если вы когда-либо работали с определенными ключами хэшей (h[:k]
), а не просто целыми хэшами (h = { ... }
), вам все равно придется использовать стиль двоеточия для символов; вам также понадобится использовать стиль с толкованием для символов, которые вы используете за пределами хэша. Я предпочитаю быть последовательным, поэтому я вообще не разбираюсь в стиле JavaScript.
Некоторые проблемы с JavaScript-стилем были исправлены в Ruby 2.2. Теперь вы можете использовать кавычки, если у вас есть символы, которые не являются допустимыми ярлыками, например:
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }
Но вы все еще нуждаетесь в хеше, если ваши ключи не являются символами.
key: "value"
- удобная функция Ruby 1.9; пока вы знаете, что ваша среда будет поддерживать его, я не вижу причин не использовать его. Гораздо проще набрать двоеточие, чем ракета, и я думаю, что он выглядит намного чище. Что касается наличия драгоценного камня для преобразования, возможно, нет, но для вас это идеальный опыт обучения, если вы еще не знаете манипуляции с файлами и регулярные выражения.
Назначения стиля key: value
JSON являются частью нового синтаксиса хеша Ruby 1.9, поэтому имейте в виду, что этот синтаксис не будет работать со старыми версиями Ruby. Кроме того, ключи будут символами. Если вы можете жить с этими двумя ограничениями, новые хеши работают так же, как старые хеши; нет никакой причины (кроме стиля, возможно), чтобы преобразовать их.
Хеш-ключи Ruby, назначенные хэш-ракетами, могут облегчать строки для пар ключ-значение (например, 's' => x
), тогда как назначение клавиш с помощью символов (например, key: "value"
или :key => "value"
) не может быть присвоенный строками. Хотя хэш-ракеты обеспечивают свободу и функциональность для хеш-таблиц, в частности, позволяя использовать строки в качестве ключей, производительность приложений может быть медленнее, чем если бы хэш-таблицы должны были быть сконструированы с символами как хэш-ключи. Следующие ресурсы могут прояснить любые различия между листами и символами:
Выполнение :key => value
такое же, как и выполнение key: value
, и на самом деле просто удобство. Я не видел других языков, которые используют =>
, но другие, такие как Javascript, используют key: value
в своих типах данных, эквивалентных Hash.
Что касается драгоценного камня, чтобы преобразовать то, как вы писали свои хеши, я бы просто придерживался того, как вы это делаете для своего текущего проекта.
* Обратите внимание, что при использовании key: value
ключ будет символом, и для доступа к значению, сохраненному на этом ключе в хеше foo
, все равно будет foo[:key]
.