Есть ли разница между значениями ": key =>" и "key:" "хэш-обозначения"?

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

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

Ответ 1

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

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 } }

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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