Відповіді:
Так, є різниця. Вони є законними:
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 , так що ви будете в кінцевому підсумку змішання стилів Hash , якщо ви використовуєте MongoDB. І якщо ви коли-небудь працюєте з певними клавішами Hashes ( h[:k]
), а не просто цілими хешами ( h = { ... }
), вам все одно доведеться використовувати стиль символів першого двокрапки для символів; вам також доведеться використовувати стиль провідної двокрапки для символів, які ви використовуєте за межами хешей. Я вважаю за краще бути послідовним, тому я взагалі не переймаюся стилем JavaScript.
Деякі проблеми зі стилем JavaScript були виправлені в Ruby 2.2. Тепер ви можете використовувати лапки, якщо у вас є символи, які не є дійсними мітками, наприклад:
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }
Але вам все одно потрібна хеш-ракетка, якщо ваші ключі не символи.
h[:s] = 42
приклад стосується цього питання? На мою думку, стиль JavaScript в порівнянні з хеш-ракетним стилем стосується лише визначення пара хеш-ключа / значення, а не для адреси хеш-елементів за ключами. Тому h[s:] = 42
приклад здається оманливим.
h[:s] = 42
позначення. Іншого варіанту немає. Коли ви визначаєте пари ключ / значення, ви отримуєте параметри { key: value }
стилю JavaScript або { :key => value }
стилю хешрокета. Сценарій адресації як і раніше, здається, не має значення для того, на чому зосереджено увагу.
key: "value"
є зручною особливістю Ruby 1.9; поки ви знаєте, що ваше оточення буде підтримувати це, я не бачу причин не використовувати його. Просто набрати двокрапку набагато простіше, ніж ракету, і я думаю, що це виглядає набагато чистіше. Що стосується того, що вам слід зробити дорогоцінний камінь для перетворення, мабуть, ні, але це здається ідеальним досвідом навчання для вас, якщо ви ще не знаєте маніпулювання файлами та регулярні вирази.
Ruby хеш-ключі, присвоєні хеш-ракетам, можуть полегшувати рядки для пар ключових значень ( напр . 's' => x
), Тоді як призначення ключів за допомогою символів ( наприклад, key: "value"
або :key => "value"
) не може бути призначено рядками. Хоча хеш-ракети забезпечують свободу та функціональність хеш-таблиць, зокрема дозволяючи рядкам в якості ключів , продуктивність програми може бути повільнішою, ніж якби хеш-таблиці були побудовані з символами як хеш-ключі. Наступні ресурси можуть бути в змозі прояснити будь-які відмінності між хешкетами та символами:
Завдання у key: value
стилі JSON є частиною нового хеш-синтаксису Ruby 1.9, тому майте на увазі, що цей синтаксис не працюватиме з більш старими версіями Ruby. Також ключі будуть символами. Якщо ви можете жити з цими двома обмеженнями, нові хеши працюють так само, як старі хеші; немає жодної причини (крім стилю, можливо) їх перетворювати.
Робити :key => value
це те саме, що робити key: value
, і насправді просто зручність. Я не бачив інших мов, які використовують цей =>
, але інші, як Javascript, використовують key: value
у своїх типах даних Hash-еквівалента.
Що стосується дорогоцінного каміння для перетворення того, як ви виписали свої хеші, я б просто дотримувався того, як ви це робите для вашого поточного проекту.
* Зауважте, що при використанні key: value
ключа буде символом, і отримати доступ до значення, збереженого в цьому ключі в foo
хеші, все одно буде foo[:key]
.
=>
. Я б здогадався, що Рубі, будучи сильно натхненною Perl, запозичив синтаксис у Perl :)
h = { 'a.b': 'c' }
тепер є законним щодо Ruby 2.2.0. Дивіться bugs.ruby-lang.org/isissue/4276