Odpowiedzi:
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 :$in
symbole 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.
h[:s] = 42
przykł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:] = 42
przykład wydaje się być mylący.
h[:s] = 42
notacji. 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.
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.
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:
Do key: value
przypisania 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ć.
Robić :key => value
jest tym samym, co robienie key: value
i 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: value
w 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: value
klucza będzie symbol, a dostęp do wartości przechowywanej w tym kluczu w foo
skrócie nadal będzie foo[:key]
.
=>
. Domyślam się, że Ruby, silnie zainspirowany Perlem, pożyczył składnię od Perla :)
h = { 'a.b': 'c' }
jest teraz legalne od wersji 2.2.0 Rubiego. Zobacz bugs.ruby-lang.org/issues/4276