2011-12-30 16 views

Odpowiedz

136

Tak, jest różnica. Są prawna:

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

ale nie są to:

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

Można również użyć coś jak klucz z => więc można to zrobić:

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

ale można” t wykonaj następujące czynności:

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

Styl JavaScript (key: value) jest użyteczny tylko wtedy, gdy wszystkie klucze skrótu są symbolami "prostymi" (mniej więcej coś, co pasuje do /\A[a-z_]\w*\z/i, AFAIK parser używa wzoru etykiety dla tych kluczy).

Symbole stylu o oznaczeniu :$in pokazują się rzetelnie podczas korzystania z MongoDB, więc w przypadku korzystania z MongoDB skończy się mieszanie stylów Hash. I jeśli kiedykolwiek pracujesz z określonymi kluczami hashe (h[:k]), a nie tylko całymi haszami (h = { ... }), nadal będziesz musiał używać stylu dwukropka dla symboli; będziesz musiał również użyć stylu colon wiodących dla symboli, których używasz poza hashe. Wolę być konsekwentny, więc w ogóle nie zawracam sobie głowy stylem JavaScript.

Niektóre problemy w stylu JavaScript zostały naprawione w Rubim 2.2. Teraz można używać cytatów jeśli masz symbole, które nie są ważne etykiety, na przykład:

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

Ale trzeba jeszcze hashrocket czy klucze nie są symbolami.

+0

'h = {'a.b': 'c'}' jest teraz legalne od Rubiego 2.2.0. Zobacz https://bugs.ruby-lang.org/issues/4276 –

+0

@BSeven: Dzięki, zaktualizowałem [moja inna duża odpowiedź hashrocket] (http://stackoverflow.com/a/10004344/479863) chwilę temu, ale brakowało ten. –

+0

Dlaczego uważasz, że przykład "h [: s] = 42" odnosi się do tego pytania? Moim zdaniem styl JavaScript vs styl hashrocket ma zastosowanie tylko do definicji hash klucz/wartość, a nie do adresowania elementów hashowych za pomocą kluczy. Dlatego przykład 'h [s:] = 42' wydaje się być mylący. –

4

Przypisania w stylu JSON są częścią nowej składni skrótu Ruby 1.9, należy więc pamiętać, że ta składnia nie będzie działać ze starszymi wersjami Rubiego. Również klawisze będą symbolami. Jeśli możesz żyć z tymi dwoma ograniczeniami, nowe skróty działają tak, jak dawne skróty; nie ma powodu (poza stylem) do ich konwersji.

+4

PS: To * nie * JSON-styl, to jest JavaScript stylu. JSON wymaga kluczy do cytowania. –

10

key: "value" to wygoda w Ruby 1.9; dopóki wiesz, że twoje środowisko będzie je wspierać, nie widzę powodu, aby go nie używać. O wiele łatwiej jest wpisać dwukropek niż rakieta i wydaje mi się, że wygląda o wiele czystsze. Jeśli chodzi o klejnot do konwersji, prawdopodobnie nie, ale wydaje się, że jest to idealne doświadczenie edukacyjne, jeśli nie znasz już manipulacji plikami i wyrażeń regularnych.

1

Wykonywanie :key => value jest takie samo jak robienie key: value i jest tak naprawdę tylko wygodą. Nie widziałem innych języków, które używają =>, ale inne, takie jak Javascript, używają key: value w swoich typach Hash-ekwiwalent.

Jeśli chodzi o klejnot, który przekształcisz sposób, w jaki pisałeś hasze, po prostu trzymałbym się tego, jak robisz to dla swojego obecnego projektu.

* Należy pamiętać, że przy użyciu key: value klucz będzie symbolem, a dostęp do wartości przechowywanej w tym kluczu w haśle foo nadal będzie wynosił foo[:key].

+0

Zarówno Perl jak i PHP używają '=>'. Domyślam się, że Ruby, będąc zainspirowanym przez Perla, pożyczył składnię od Perla :) –

2

Ruby mieszania klucze przypisane mieszającą rakiet może ułatwić struny dla par klucz (wartości np. 's' => x), natomiast klucz przypisanie poprzez symboli (npkey: "value" lub :key => "value") nie może być przypisana do łańcuchów. Chociaż hash-rakiety zapewniają swobodę i funkcjonalność dla tabel mieszania, , w szczególności zezwalając na łańcuchy jako klucze, wydajność aplikacji może być wolniejsza niż w przypadku, gdy tablice skrótów miałyby być konstruowane z symbolami jako kluczami-hasłami. Poniższe zasoby mogą być w stanie wyjaśnić rozbieżności pomiędzy hashrockets i symboli:

Powiązane problemy