Есть ли разница между хэш-нотациями": 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]
.