2016-04-09 32 views
13

Przy użyciu Ruby 2.3:Dlaczego ten klucz ciągu w haszowniku przekonwertowany na symbol?

W przykładzie 1 klucz ciągowy "a" jest automatycznie konwertowany na symbol, podczas gdy w przykładzie 2 pozostaje ciągiem.

Przykład 1

{"a": 1} 
# => {:a=>1} 

Przykład 2

{"a"=>"c"} 
# => {"a"=>"c"} 

Myślałem : była taka sama jak hash rakietowego => składni starym stylu. Co się dzieje? Dlaczego nigdy nie zauważyłem tego w Railsach? Czy to ukrywa to w przypadku HashWithIndifferentAccess?

+0

@Zabba Dlaczego trzeba dodać, że wersja? Działa tylko w ostatnich Rubys. Jeśli OP mówi, że działa, oznacza to, że jest to ostatnia wersja. – sawa

+2

OP wspomniał o tej wersji w pytaniu, więc nie należy jej usuwać, ponieważ usunięcie go zmieniłoby sens i intencję pytania, a więc po prostu bycie oryginalnym tutaj. – Zabba

+1

To nie jest klucz łańcucha, to klucz symboliczny. Nic się nie zmienia. –

Odpowiedz

3

Jest to spowodowane nową składnią skrótu wprowadzoną przy użyciu ruby ​​1.9. Składnia z dwukropkiem działa tylko z kluczami symboli. Nazywa się on hash "symbol do obiektu" i jest to tylko cukier syntaktyczny dla najpopularniejszego stylu skrótów. Kolejny punkt dla mnie, jest bliższy notacji obiektu javascript.

Jeśli mam typy mieszane, wolę stary styl (składnia hash-rocket), ale to zależy od ciebie. Mieszanie dwóch stylów wydaje mi się brzydkie.

+2

To nie jest składnia wprowadzona w Rubim 1.9. – sawa

+0

Nie jest blisko notacji javascript. JavaScript nie rozróżnia łańcuchów i symboli. – sawa

+2

@sawa nowa składnia została wprowadzona w Rubim 1.9 i jest bliżej notacji javascript. – Reyko

20

W Ruby 2.3 (.0), są wszystkie takie same:

{:"a" => 1} 
{"a": 1}, 
{:a => 1} 
{a: 1} 

Wszyscy przełożyć do tej samej rzeczy: a jest symbolem we wszystkich tych przypadkach.

{"a"=>1} to co innego: a to ciąg znaków w tym przypadku.

0

Według Ruby documentation:

obiekty Blockquote Symbol stanowią nazwy i sznurki wewnątrz interpretera Ruby. Są generowane przy użyciu składni liter: name i: string oraz różnych metod to_sym. [...]

Oznacza to, że działa:

$ ruby -e ruby -e "h = {key: \"value\"}; puts h" 
$ ruby -e ruby -e "h = {:key => \"value\"}; puts h" 
$ ruby -e ruby -e "h = {\"key\": \"value\"}; puts h" 
$ ruby -e ruby -e "h = {:\"key\" => \"value\"}; puts h" 
$ ruby -e ruby -e "h = {\"#{:key}\": \"value\"}; puts h" 

będzie produkować ten sam wynik:

$ {:key=>"value"}