Есть ли разница между хэш-нотациями `: key =>" value "` и `key:" value "`? - PullRequest
116 голосов
/ 30 декабря 2011

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

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

Ответы [ 5 ]

145 голосов
/ 30 декабря 2011

Да, есть разница.Это допустимо:

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) полезен только в том случае, если все ваши ключи Hash являются «простыми» символами (более или менее совпадающими)./\A[a-z_]\w*\z/i, AFAIK синтаксический анализатор использует свой шаблон метки для этих ключей).

Символы стиля :$in показывают значительный бит при использовании MongoDB, поэтому вы в конечном итоге будете смешивать стили хэша, если будете использовать MongoDB.И, если вы когда-либо работаете с определенными ключами хэшей (h[:k]), а не только с целыми хешами (h = { ... }), вам все равно придется использовать стиль двоеточия для символов;вам также придется использовать стиль ведущей двоеточия для символов, которые вы используете вне хэшей.Я предпочитаю быть последовательным, поэтому вообще не беспокоюсь о стиле JavaScript.

Некоторые проблемы со стилем JavaScript были исправлены в Ruby 2.2.Теперь вы можете использовать кавычки, если у вас есть символы, которые не являются допустимыми метками, например:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

Но вам все еще нужен хеш -рокет, если ваши ключи не являются символами.

10 голосов
/ 30 декабря 2011

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

4 голосов
/ 30 декабря 2011

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

3 голосов
/ 20 февраля 2016

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

1 голос
/ 23 июля 2015

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

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

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

...