Ответы:
Да, разница есть. Это законно:
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 символы стиля отображаются довольно часто, так что в конечном итоге вы будете смешивать стили хэша, если используете MongoDB. И, если вы когда-нибудь будете работать с определенными ключами Hashes ( h[:k]
), а не только с целыми хэшами ( h = { ... }
), вам все равно придется использовать стиль, начинающийся с двоеточия, для символов; вам также придется использовать стиль с начальным двоеточием для символов, которые вы используете вне хэшей. Я предпочитаю быть последовательным, чтобы вообще не беспокоиться о стиле JavaScript.
Некоторые проблемы со стилем JavaScript были исправлены в Ruby 2.2. Теперь вы можете использовать кавычки, если у вас есть символы, которые не являются допустимыми ярлыками, например:
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }
Но вам все равно понадобится hashrocket, если ваши ключи не являются символами.
h[:s] = 42
пример относится к этому вопросу? На мой взгляд, стиль JavaScript и стиль hashrocket имеет отношение только к определению пары хэш-ключ / значение, а не к адресации хеш-элементов по ключам. Поэтому этот h[s:] = 42
пример кажется обманчивым.
h[:s] = 42
нотацию. Другого варианта нет. Когда вы определяете пары ключ / значение, у вас есть варианты стиля { key: value }
JavaScript или { :key => value }
стиля hashrocket. Сценарий адресации все еще кажется неуместным для того, что находится в центре внимания.
key: "value"
удобная функция Ruby 1.9; пока вы знаете, что ваша среда будет его поддерживать, я не вижу причин не использовать его. Просто набрать двоеточие намного проще, чем ракету, и я думаю, что это выглядит намного чище. Что касается наличия драгоценного камня для преобразования, вероятно, нет, но это похоже на идеальный опыт для вас, если вы еще не знаете манипуляции с файлами и регулярные выражения.
Рубиновые хэш-ключи , присвоенные хэш-ракетах может облегчить строки для пар ключ-значение ( например . 's' => x
) , Тогда как присвоение ключа через символы ( например key: "value"
, или :key => "value"
) не могут быть назначены со строками. Хотя хеш-таблицы предоставляют свободу и функциональность для хеш-таблиц, в частности, разрешая строки в качестве ключей , производительность приложения может быть ниже, чем если бы хеш-таблицы были построены с символами в качестве хеш-ключей. Следующие ресурсы могут прояснить любые различия между hashrocket и символами:
Назначения в key: value
стиле JSON являются частью нового синтаксиса хеширования Ruby 1.9, поэтому имейте в виду, что этот синтаксис не будет работать со старыми версиями Ruby. Также ключи будут символами. Если вы можете жить с этими двумя ограничениями, новые хэши работают так же, как старые хэши; нет причин (кроме стиля, возможно) преобразовывать их.
Делать :key => value
то же самое, что и делать key: value
, и на самом деле это просто удобство. Я не встречал других языков, которые использовали бы =>
, но другие, такие как Javascript, используют key: value
в своих типах данных, эквивалентных Hash.
Что касается драгоценного камня для преобразования того, как вы записывали свои хэши, я бы просто придерживался того, как вы это делаете для своего текущего проекта.
* Обратите внимание, что при использовании key: value
ключа будет символ, и для доступа к значению, хранящемуся в этом ключе в foo
хеш-коде, все равно будет foo[:key]
.
=>
. Я предполагаю, что Ruby, сильно вдохновленный Perl, позаимствовал синтаксис из Perl :)
h = { 'a.b': 'c' }
теперь разрешен с Ruby 2.2.0. См. Bugs.ruby-lang.org/issues/4276