Есть ли разница между хэш-нотацией `: key =>« value »` и `key:« value »`?

124

Есть ли разница между :key => "value"обозначениями (hashrocket) и key: "value"(Ruby 1.9)?

Если нет, то я хотел бы использовать key: "value"обозначения. Есть ли драгоценный камень, который помогает мне преобразовать из :x =>в x:нотации?

AdamNYC
источник

Ответы:

153

Да, разница есть. Это законно:

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, если ваши ключи не являются символами.

mu слишком короткий
источник
h = { 'a.b': 'c' }теперь разрешен с Ruby 2.2.0. См. Bugs.ruby-lang.org/issues/4276
B Seven
@BSeven: Спасибо, я недавно обновил свой другой ответ на большой хэш-запуск, но пропустил этот.
mu слишком короткое
Как вы думаете, почему этот h[:s] = 42пример относится к этому вопросу? На мой взгляд, стиль JavaScript и стиль hashrocket имеет отношение только к определению пары хэш-ключ / значение, а не к адресации хеш-элементов по ключам. Поэтому этот h[s:] = 42пример кажется обманчивым.
Ник Нилов
@NicNilov Это актуально, потому что стиль JavaScript основан на символах, таких как хеш-ключи, а допустимые обозначения, как ни странно, зависят от контекста.
mu слишком короткое
Не могу согласиться. При адресации хеш-слота по символу вы всегда используете h[:s] = 42нотацию. Другого варианта нет. Когда вы определяете пары ключ / значение, у вас есть варианты стиля { key: value }JavaScript или { :key => value }стиля hashrocket. Сценарий адресации все еще кажется неуместным для того, что находится в центре внимания.
Ник Нилов
11

key: "value"удобная функция Ruby 1.9; пока вы знаете, что ваша среда будет его поддерживать, я не вижу причин не использовать его. Просто набрать двоеточие намного проще, чем ракету, и я думаю, что это выглядит намного чище. Что касается наличия драгоценного камня для преобразования, вероятно, нет, но это похоже на идеальный опыт для вас, если вы еще не знаете манипуляции с файлами и регулярные выражения.

ranksrejoined
источник
5

Рубиновые хэш-ключи , присвоенные хэш-ракетах может облегчить строки для пар ключ-значение ( например . 's' => x) , Тогда как присвоение ключа через символы ( например key: "value" , или :key => "value") не могут быть назначены со строками. Хотя хеш-таблицы предоставляют свободу и функциональность для хеш-таблиц, в частности, разрешая строки в качестве ключей , производительность приложения может быть ниже, чем если бы хеш-таблицы были построены с символами в качестве хеш-ключей. Следующие ресурсы могут прояснить любые различия между hashrocket и символами:

alexanderjsingleton
источник
4

Назначения в key: valueстиле JSON являются частью нового синтаксиса хеширования Ruby 1.9, поэтому имейте в виду, что этот синтаксис не будет работать со старыми версиями Ruby. Также ключи будут символами. Если вы можете жить с этими двумя ограничениями, новые хэши работают так же, как старые хэши; нет причин (кроме стиля, возможно) преобразовывать их.

sczizzo
источник
5
PS: Это не в стиле JSON, это в стиле JavaScript. JSON требует, чтобы ключи были указаны в кавычках.
mu слишком короткий
1

Делать :key => valueто же самое, что и делать key: value, и на самом деле это просто удобство. Я не встречал других языков, которые использовали бы =>, но другие, такие как Javascript, используют key: valueв своих типах данных, эквивалентных Hash.

Что касается драгоценного камня для преобразования того, как вы записывали свои хэши, я бы просто придерживался того, как вы это делаете для своего текущего проекта.

* Обратите внимание, что при использовании key: valueключа будет символ, и для доступа к значению, хранящемуся в этом ключе в fooхеш-коде, все равно будет foo[:key].

Чарльз
источник
И Perl, и PHP используют =>. Я предполагаю, что Ruby, сильно вдохновленный Perl, позаимствовал синтаксис из Perl :)
Даниэль Серодио,