2015-07-17 9 views
5

TL; DR — Pytanie

Czy { 'symbol name': 5 } i { "symbol name": 5 } ważne i dobrze zdefiniowane Ruby 2 składni dla mieszań?Czy {'symbol name': "some value"} poprawna składnia Ruby 2 dla hashe?

6 Oznaczenia dla mieszań, 2 z nich jeszcze nieznane

W Ruby 2 dodaje Hash dosłownych oznaczenia są równoważne

{ :my_key => 5 } 
{ my_key: 5 } 
{ :'my_key' => 5 } 
{ :"my_key" => 5 } 
  1. Pierwsza linia jest ogólnym Hash dosłownym oznaczenie (tj działa również dla kluczy innych niż symbole), z domyślną notacją Symbol dla klucza.
  2. Druga linia to nowa notacja krótka wprowadzona przez Ruby 2Ruby 1.9 dla hashe z symbolami jako kluczami.
  3. Trzecia linia jest znowu ogólną notacją dosłowną Hashem, z alternatywną literalną notacją klawisza. (Ta alternatywna notacja literowa Symbol jest przydatna, jeśli potrzebujesz spacji lub innych wymyślnych znaków w nazwach symboli.)
  4. Czwarta linia to niewielka zmiana powyższego, która pozwala również na interpolację ciągów znaków w nazwie symbolu.

W pierwsze dwa notacje są documented on the Core API page for Hash. Notacja czwartego jest po prostu podłączeniem alternatywnej notacji literowej (która jest documented in the Core API page for Symbol) do pierwszej notacji skrótu, więc nie jest to właściwie inna notacja dla literałów skrótu. To samo dotyczy notacji trzeciej. To, że notacja literowa Symbol pojedynczego cytatu nie jest wspomniana na stronie Core API, nie przeszkadza mi zbytnio, ponieważ wygląda na to, że działa dokładnie tak, jak się spodziewałam.

Ale ostatnio zauważyłem następujące oznaczenia działa zbyt, a także są równoważne do tych powyżej:

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

Choć jest trochę spójne (i działa jak bym się spodziewał, nie spodziewałem się tego być w ogóle ważne) i prawdopodobnie przydatne, uważam to za wystarczająco niezwykłe, aby być nieco zaskoczonym. Nie mogłem znaleźć żadnej dokumentacji na temat tej składni, a ta składnia nie została skonstruowana tylko poprzez podłączenie udokumentowanych notacji do innych udokumentowanych notacji, takich jak trzecie i czwarte oznaczenie powyżej. (Jest to bardziej jak „scalania” drugi z trzecim lub czwartym notacji). Dlatego zastanawiałem się:

Czy to ten właśnie mój Ruby tłumacza (MRIruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]) bycie miłym o składni nieokreślonej, lub jest to jakie zachowanie mogę oczekiwać od każdej implementacji Ruby 2?

(nie wiem, czy to pytanie ma sens, jeśli jest as Brian Shirai claims że „Ruby jest co [MRI] Does”).

+0

Ta składnia stała się dostępna w Ruby 2 – jollarvia

+1

@jollarvia: Masz na myśli 2.2, 2.0 i 2.1 zobacz '{'s': v}' jako błąd składni. –

+1

Możesz rozważyć dodanie przykładów tej nowej składni do dokumentów samodzielnie. http://documenting-ruby.org/ jest pomocnym źródłem informacji. – cremno

Odpowiedz

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

Żadna z powyższych linii nie używa składni tylko 2.x. Wszystkie one również mają poprawną składnię 1.9. (See demonstration.)

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

To feature request #4276 który wylądował w 2.2. Oznacza to, że jest to nieprawidłowa składnia w wersji 2.1 lub nawet starszej. Oznacza to również, że implementacja, która twierdzi, że implementuje 2.2, musi go wspierać.

0

Jeśli są około dwukrotnie vs znaków pojedynczego cudzysłowu, dlaczego nie również zrobić

{'my_key': 'my value' } i dodać jeszcze jedną metodę konstruowania hasza do listy?

+0

Moje pytanie naprawdę mogło być zrobione z tym, że wspomniałem * albo * trzecią ('' '' '' ''> 5} ') ** lub ** czwartą (" {: "klucz" => 5}) składnia. Wspomniałem tylko o kompletności. Ani ja, ani moje pytanie nie "chodzi o podwójne lub pojedyncze" cytaty. Raczej wszystko na temat literackiej składni Hash, szczególnie w odniesieniu do ich kluczowych literałów. Dlatego nie zmieniłem literału wartości. –

+0

Mam [zmieniono przykłady w pytaniu] (http://stackoverflow.com/revisions/31483296/3), aby używać liczb całkowitych zamiast ciągów dla wartości skrótu, tak aby istniała tylko jedna literalna notacja dla wartości. –

+0

Rozumiem. To jest poprawna składnia. Ale w {'nazwa symbolu': '5'} klasą "5" będzie łańcuch; in {'symbol name': 5}, klasa 5 będzie Fixnum. – Eupatoria

Powiązane problemy