Czy jest jakaś różnica między notacjami haszującymi `: key =>" value "` i `key:" value "`?

124

Czy jest jakaś różnica między :key => "value"(hashrocket) a key: "value"(Ruby 1.9) notacjami ?

Jeśli nie, to chciałbym użyć key: "value"notacji. Czy jest jakiś klejnot, który pomaga mi przekonwertować z :x =>do x:zapisów?

AdamNYC
źródło

Odpowiedzi:

153

Tak, jest różnica. Są to legalne:

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

ale to nie są:

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

Możesz również użyć czegokolwiek jako klucza, =>więc możesz to zrobić:

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

ale nie możesz tego zrobić:

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

Styl JavaScript ( key: value) jest przydatny tylko wtedy, gdy wszystkie klucze z krzyżykiem są „prostymi” symbolami (mniej więcej coś, co pasuje /\A[a-z_]\w*\z/i, AFAIK parser używa wzorca etykiety dla tych kluczy).

Te :$insymbole styl pokazać się w porządku trochę przy użyciu MongoDB więc będziesz skończyć mieszanie stylów Hash jeśli używasz MongoDB. A jeśli kiedykolwiek będziesz pracować z określonymi kluczami funkcji Hashes ( h[:k]), a nie tylko z całymi skrótami ( h = { ... }), nadal będziesz musiał używać stylu dwukropka dla symboli; będziesz musiał również użyć stylu dwukropka wiodącego dla symboli, których używasz poza hashes. Wolę być konsekwentny, więc w ogóle nie zawracam sobie głowy stylem JavaScript.

Niektóre problemy ze stylem JavaScript zostały naprawione w Rubim 2.2. Możesz teraz używać cudzysłowów, jeśli masz symbole, które nie są prawidłowymi etykietami, na przykład:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

Ale nadal potrzebujesz hashrocket, jeśli twoje klucze nie są symbolami.

mu jest za krótkie
źródło
h = { 'a.b': 'c' }jest teraz legalne od wersji 2.2.0 Rubiego. Zobacz bugs.ruby-lang.org/issues/4276
B Seven
@BSeven: Dzięki, jakiś czas temu zaktualizowałem moją drugą dużą odpowiedź typu hashrocket, ale przegapiłem tę.
mu jest za krótkie
Dlaczego uważasz, że h[:s] = 42przykład odnosi się do tego pytania? Moim zdaniem styl JavaScript a styl hashrocket jest istotny tylko dla definicji pary klucz / wartość skrótu, a nie dla adresowania elementów hash za pomocą kluczy. Dlatego h[s:] = 42przykład wydaje się być mylący.
Nic Nilov,
@NicNilov Jest to istotne, ponieważ styl JavaScript dotyczy symboli, ponieważ klucze z krzyżykiem, a dozwolone notacje są, myląco, zależne od kontekstu.
mu jest za krótkie
Nie mogę się zgodzić. Podczas adresowania pola z krzyżykiem za pomocą symbolu zawsze używasz h[:s] = 42notacji. Nie ma innej opcji. Kiedy definiujesz pary klucz / wartość, masz opcje { key: value }stylu JavaScript lub { :key => value }stylu hashrocket. Scenariusz adresowania nadal wydaje się nie mieć znaczenia dla tego, na czym się skupiamy.
Nic Nilov
11

key: "value"jest wygodną funkcją Rubiego 1.9; dopóki wiesz, że twoje środowisko będzie je obsługiwać, nie widzę powodu, by z niego nie korzystać. Po prostu znacznie łatwiej jest wpisać dwukropek niż rakietę i myślę, że wygląda o wiele czysto. Jeśli chodzi o to, że konwersja jest klejnotem, prawdopodobnie nie, ale wydaje się to idealnym doświadczeniem edukacyjnym dla Ciebie, jeśli nie znasz jeszcze manipulacji plikami i wyrażeń regularnych.

ranksrejoined
źródło
5

Rubinowe klucze hash przypisane przez rakiety hashujące mogą ułatwić tworzenie łańcuchów dla par klucz-wartość ( np . 's' => x), Podczas gdy przypisywanie kluczy za pomocą symboli ( np. key: "value" Lub :key => "value") nie może być przypisane za pomocą łańcuchów. Chociaż rakiety mieszające zapewniają swobodę i funkcjonalność dla tablic mieszających, w szczególności zezwalając na ciągi jako klucze , wydajność aplikacji może być wolniejsza niż gdyby tablice skrótów były konstruowane z symbolami jako kluczami skrótu. Poniższe zasoby mogą być w stanie wyjaśnić wszelkie różnice między hashrockets i symbolami:

alexanderjsingleton
źródło
4

Do key: valueprzypisania JSON-style są częścią nowej składni Ruby 1.9 hash, więc pamiętać, że ta składnia nie będzie działać ze starszymi wersjami Ruby. Ponadto klucze będą symbolami. Jeśli możesz żyć z tymi dwoma ograniczeniami, nowe skróty działają tak samo, jak stare; nie ma powodu (być może poza stylem), aby je konwertować.

sczizzo
źródło
5
PS: To nie jest w stylu JSON, jest w stylu JavaScript. JSON wymaga cytowania kluczy.
mu jest za krótkie
1

Robić :key => value jest tym samym, co robienie key: valuei jest po prostu wygodą. Nie widziałem innych języków, które używają the =>, ale inne, takie jak Javascript, używają the key: valuew swoich odpowiednikach Hash typów danych.

Jeśli chodzi o klejnot do konwersji sposobu, w jaki zapisałeś swoje skróty, po prostu trzymałbym się sposobu, w jaki robisz to dla bieżącego projektu.

* Zauważ, że w użyciu key: valueklucza będzie symbol, a dostęp do wartości przechowywanej w tym kluczu w fooskrócie nadal będzie foo[:key].

Charles
źródło
Używa zarówno Perla, jak i PHP =>. Domyślam się, że Ruby, silnie zainspirowany Perlem, pożyczył składnię od Perla :)
Daniel Serodio