Чи є різниця між хеш-позначеннями `: key =>" value "` і `key:" value "`?


124

Чи є різниця між :key => "value"позначеннями (hashrocket) та key: "value"(Ruby 1.9)?

Якщо ні, то я хотів би використовувати key: "value"позначення. Чи є дорогоцінний камінь, який допомагає мені перетворюватися :x =>на x:нотації?

Відповіді:


153

Так, є різниця. Вони є законними:

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 = { 'a.b': 'c' }тепер є законним щодо Ruby 2.2.0. Дивіться bugs.ruby-lang.org/isissue/4276
B Сім


Чому ви вважаєте, що h[:s] = 42приклад стосується цього питання? На мою думку, стиль JavaScript в порівнянні з хеш-ракетним стилем стосується лише визначення пара хеш-ключа / значення, а не для адреси хеш-елементів за ключами. Тому h[s:] = 42приклад здається оманливим.
Нік Нілов

@ NicNilov Це актуально, оскільки стиль JavaScript стосується символів, як клавіш Hash, а дозволені позначення залежать від конфузу, залежно від контексту.
му занадто короткий

Не можу погодитись. Звертаючись до слота хеша символом, ви завжди використовуєте h[:s] = 42позначення. Іншого варіанту немає. Коли ви визначаєте пари ключ / значення, ви отримуєте параметри { key: value }стилю JavaScript або { :key => value }стилю хешрокета. Сценарій адресації як і раніше, здається, не має значення для того, на чому зосереджено увагу.
Нік Нілов

11

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


5

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


4

Завдання у key: valueстилі JSON є частиною нового хеш-синтаксису Ruby 1.9, тому майте на увазі, що цей синтаксис не працюватиме з більш старими версіями Ruby. Також ключі будуть символами. Якщо ви можете жити з цими двома обмеженнями, нові хеши працюють так само, як старі хеші; немає жодної причини (крім стилю, можливо) їх перетворювати.


5
PS: Це не стиль JSON, це стиль JavaScript. JSON вимагає котирування ключів.
му занадто короткий

1

Робити :key => valueце те саме, що робити key: value, і насправді просто зручність. Я не бачив інших мов, які використовують цей =>, але інші, як Javascript, використовують key: valueу своїх типах даних Hash-еквівалента.

Що стосується дорогоцінного каміння для перетворення того, як ви виписали свої хеші, я б просто дотримувався того, як ви це робите для вашого поточного проекту.

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


Як Perl, так і PHP використовують =>. Я б здогадався, що Рубі, будучи сильно натхненною Perl, запозичив синтаксис у Perl :)
Даніель Серодіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.