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

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

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

5 ответов


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

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

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

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

но все равно нужно hashrocket если ваши ключи не являются символами.


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


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


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


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

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

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