2016-04-09 3 views
13

mit Ruby 2.3:Warum wird dieser String-Schlüssel in einem Hash in ein Symbol umgewandelt?

In Beispiel 1 wird der Stringschlüssel "a" wird automatisch in ein Symbol umgewandelt, während bei Beispiel 2, bleibt es eine Zeichenfolge.

Beispiel 1

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

Beispiel 2

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

ich : dachte, war die gleiche wie die alten Hash-Rakete => Syntax Stil. Was ist los? Warum habe ich das in Rails nie bemerkt? Ist es die HashWithIndifferentAccess, die das verdunkelt?

+0

@Zabba Warum haben Sie brauchen diese Version hinzufügen? Es funktioniert nur in den letzten Rubys. Wenn das OP sagt, dass es funktioniert, bedeutet dies, dass es sich um eine aktuelle Version handelt. – sawa

+2

Das OP erwähnte diese Version in der Frage, daher ist es nicht angemessen, sie zu entfernen, da das Entfernen die Bedeutung und die Absicht der Frage verändern würde. – Zabba

+1

Es ist kein String-Schlüssel, es ist ein Symbol-Schlüssel. Nichts wird geändert. –

Antwort

3

Es ist wegen der neuen Hash-Syntax mit Ruby 1.9 eingeführt. Die Syntax mit Doppelpunkt funktioniert nur mit Symbolschlüsseln. Es wird als "Symbol zu Objekt" Hash bezeichnet und es ist nur syntaktischer Zucker für die gebräuchlichste Art von Hashes da draußen. Ein weiterer Punkt für mich, es ist näher an der JavaScript-Objektnotation.

Wenn ich gemischte Schlüsseltypen habe, dann bevorzuge ich den alten Stil (Hash-Rakete-Syntax), aber das liegt an Ihnen. Das Mischen der beiden Stile sieht hässlich aus.

+2

Dies ist nicht die in Ruby 1.9 eingeführte Syntax. – sawa

+0

Es ist nicht in der Nähe der Javascript-Notation. Javascript unterscheidet keine Zeichenfolgen und Symbole. – sawa

+2

@sawa Die neue Syntax wurde in Ruby 1.9 eingeführt und ist näher an der JavaScript-Notation. – Reyko

20

In Ruby 2.3 (0,0), das sind alle gleich:

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

Sie alle auf dasselbe übersetzen: a ein Symbol in allen diesen Fällen ist.

{"a"=>1} ist anders: a ist eine Zeichenfolge in diesem Fall.

0

Nach Ruby documentation:

Blockquote Symbol Objekte repräsentieren Namen und einige Zeichenfolgen in der Ruby-Interpreter. Sie werden mit der Syntax "name" und "string" und den verschiedenen to_sym-Methoden generiert. [...]

Dies bedeutet, dass das Laufen:

$ 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" 

das gleiche Ergebnis produzieren:

$ {:key=>"value"} 
Verwandte Themen