2015-07-17 12 views
5

TL; DR — Вопрос

ли { 'symbol name': 5 } и { "symbol name": 5 } действует и хорошо определен синтаксис рубин 2 для хэшей?Есть {'symbol name': "some value"} действительный синтаксис Ruby 2 для хэшей?

6 Условные обозначения для хэшей, 2 из них еще неизвестным

В Ruby 2, следующие Хэш буквенные обозначения эквивалентны:

{ :my_key => 5 } 
{ my_key: 5 } 
{ :'my_key' => 5 } 
{ :"my_key" => 5 } 
  1. Первая строка является общим Хэш буквальным обозначения (т.е. также работает для несимвольных клавиш), с литеральной записью символа по умолчанию для ключа.
  2. Вторая строка - это новая короткая нотация, введенная Ruby 2Ruby 1.9 для хэшей с символами в виде ключей.
  3. Третья строка - это общая буквальная буква Hash, с альтернативной символической записью символа для ключа. (Это альтернативное условное обозначение символа удобно, если вам нужно иметь пробелы или другие причудливые символы в ваших символьных именах.)
  4. Четвертая строка представляет собой небольшое изменение выше, что также допускает интерполяцию строк в имени символа.

В первые два нотации documented on the Core API page for Hash. Нотация просто включает в себя альтернативную символическую нотацию символа (то есть documented in the Core API page for Symbol) к первой нотации Хэша, поэтому это не совсем другое обозначение для хэш-литералов. То же самое касается третий обозначение. То, что литеральная нотация символов с одной кавычкой не упоминается на странице Symbol Core API, не слишком беспокоит меня, поскольку она работает так, как я ожидал.

Но в последнее время я заметил следующие условные обозначения работы тоже, а также эквивалентно приведенным выше:

{ "my_key": 5 } 
{ 'my_key': 5 } 

Хотя это своего рода последовательный (и работает, как я ожидал, что я ожидал, что это быть действительным вообще) и, вероятно, полезно, я нахожу это достаточно замечательным, чтобы немного удивляться. Я не мог найти никакой документации по этому синтаксису, и этот синтаксис не просто построен путем подключения документированных обозначений в другие документированные обозначения, такие как третья и четвертая нотации выше. (Это больше похоже на «слияние» второй с третьей или четвертой нотации.) Таким образом, я задавался вопросом:

Является ли это это просто мой рубин переводчик (MRIruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]) быть хорошим о неопределенном синтаксиса, или это Я могу ожидать от любой реализации Ruby 2?

(Не уверен, имеет ли этот вопрос смысла, если это as Brian Shirai claims, что «Рубин Is What [MRI] Имеет ли».)

+0

Этот синтаксис стал доступен в Ruby 2 – jollarvia

+1

@jollarvia: Вы имеете в виду 2.2, 2.0 и 2.1 см. '{'S': v}' в качестве синтаксической ошибки. –

+1

Вы можете рассмотреть возможность добавления примеров этого нового синтаксиса в документы. http://documenting-ruby.org/ - полезный ресурс. – cremno

ответ

7
{ :my_key => "my value" } 
{ my_key: "my value" } 
{ :'my_key' => "my value" } 
{ :"my_key" => "my value" } 

Ни одна из указанных строк не использует синтаксис 2.x. Все они также имеют синтаксис 1.9. (See demonstration.)

{ "my_key": "my value" } 
{ 'my_key': "my value" } 

Это feature request #4276, который приземлился в 2.2. Это означает, что это недопустимый синтаксис в версиях 2.1 или даже более ранних версий. Это также означает, что реализация, претендующая на внедрение 2.2, должна поддерживать ее.

0

Если вы все о двойных против одного кавычек, почему бы не сделать

{'my_key': 'my value' } и добавить еще один способ построения хэша в свой список?

+0

Мой вопрос действительно мог бы сделать, просто отметив * либо * третий ('{: 'key' => 5}') ** или ** четвертый ('{:" key "=> 5}) синтаксис. Я упомянул только об полноте. Ни я, ни мой вопрос не являются «все о двойных или одиночных» цитатах. Скорее всего, речь идет о синтаксисе хэш-букв, особенно в отношении их ключевых литералов. Поэтому я не изменял значение буквально. –

+0

Я [изменил примеры в вопросе] (http://stackoverflow.com/revisions/31483296/3), чтобы использовать целые числа вместо строк для значений Hash, так что для значений есть только одна буквальная нотация. –

+0

Получил это. Это допустимый синтаксис. Но в {'symbol name': '5'} класс '5' будет String; в {'symbol name': 5}, класс 5 будет Fixnum. – Eupatoria