Gibt es einen Unterschied zwischen den Hash-Notationen `: key =>" value "` und `key:" value "`?

124

Gibt es einen Unterschied zwischen :key => "value"(Hashrocket) und key: "value"(Ruby 1.9) Notationen?

Wenn nicht, möchte ich die key: "value"Notation verwenden. Gibt es ein Juwel , das mir zu konvertieren von hilft :x =>zu x:Notationen?

AdamNYC
quelle

Antworten:

153

Ja, da gibt es einen Unterschied. Diese sind legal:

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

aber das sind nicht:

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

Sie können auch alles als Schlüssel =>verwenden, um dies zu tun:

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

aber das kannst du nicht machen:

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

Der JavaScript-Stil ( key: value) ist nur nützlich, wenn alle Ihre Hash-Schlüssel "einfache" Symbole sind (mehr oder weniger /\A[a-z_]\w*\z/ipassend, AFAIK der Parser verwendet sein Beschriftungsmuster für diese Schlüssel).

Die :$inStilsymbole werden bei Verwendung von MongoDB ziemlich häufig angezeigt, sodass Sie bei Verwendung von MongoDB am Ende Hash-Stile mischen. Und wenn Sie jemals mit bestimmten Schlüsseln von Hashes arbeiten (h[:k] ) und nicht nur mit ganzen Hashes ( h = { ... }) arbeiten, müssen Sie immer noch den Doppelpunktstil für Symbole verwenden. Sie müssen auch den führenden Doppelpunkt für Symbole verwenden, die Sie außerhalb von Hashes verwenden. Ich bevorzuge es, konsistent zu sein, damit ich mich überhaupt nicht mit dem JavaScript-Stil beschäftige.

Einige der Probleme mit dem JavaScript-Stil wurden in Ruby 2.2 behoben. Sie können jetzt Anführungszeichen verwenden, wenn Sie Symbole haben, die keine gültigen Bezeichnungen sind, z. B.:

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

Aber Sie brauchen immer noch das Hashrocket, wenn Ihre Schlüssel keine Symbole sind.

mu ist zu kurz
quelle
h = { 'a.b': 'c' }ist jetzt ab Ruby 2.2.0 legal. Siehe bugs.ruby-lang.org/issues/4276
B Seven
@BSeven: Danke, ich habe meine andere große Hashrocket-Antwort vor einiger Zeit aktualisiert , aber diese verpasst.
Mu ist zu kurz
Warum h[:s] = 42bezieht sich das Beispiel Ihrer Meinung nach auf diese Frage? Meiner Meinung nach ist der JavaScript-Stil im Vergleich zum Hashrocket-Stil nur für die Definition von Hash-Schlüssel / Wert-Paaren relevant und nicht für die Adressierung von Hash-Elementen durch Schlüssel. Daher h[s:] = 42scheint das Beispiel irreführend zu sein.
Nic Nilov
@NicNilov Das ist relevant, da es im JavaScript-Stil um Symbole als Hash-Schlüssel geht und die zulässigen Notationen verwirrenderweise kontextabhängig sind.
Mu ist zu kurz
Kann nicht zustimmen. Wenn Sie einen Hash-Slot mit einem Symbol adressieren, verwenden Sie immer die h[:s] = 42Notation. Es gibt keine andere Option. Wenn Sie Schlüssel / Wert-Paare definieren, erhalten Sie Optionen für den { key: value }JavaScript-Stil oder den { :key => value }Hashrocket-Stil. Das Adressierungsszenario scheint immer noch nicht relevant für das zu sein, was im Fokus steht.
Nic Nilov
11

key: "value"ist eine praktische Funktion von Ruby 1.9; Solange Sie wissen, dass Ihre Umgebung dies unterstützt, sehe ich keinen Grund, es nicht zu verwenden. Es ist einfach viel einfacher, einen Doppelpunkt als eine Rakete einzugeben, und ich denke, er sieht viel sauberer aus. Es gibt wahrscheinlich ein Juwel für die Konvertierung, aber es scheint eine ideale Lernerfahrung für Sie zu sein, wenn Sie die Dateimanipulation und die regulären Ausdrücke noch nicht kennen.

Ränge wieder verbunden
quelle
5

Von Hash-Raketen zugewiesene Ruby-Hash-Schlüssel können Zeichenfolgen für Schlüssel-Wert-Paare ( z . B.'s' => x ) erleichtern, während die Schlüsselzuweisung über Symbole ( z. B. key: "value" oder :key => "value") nicht mit Zeichenfolgen zugewiesen werden kann. Obwohl Hash-Rockets Freiheit und Funktionalität für Hash-Tabellen bieten und insbesondere Zeichenfolgen als Schlüssel zulassen , kann die Anwendungsleistung langsamer sein, als wenn die Hash-Tabellen mit Symbolen als Hash-Schlüsseln erstellt würden. Die folgenden Ressourcen können möglicherweise Unterschiede zwischen Hashrockets und Symbolen verdeutlichen:

alexanderjsingleton
quelle
4

Die key: valueZuweisungen im JSON-Stil sind Teil der neuen Ruby 1.9-Hash-Syntax. Beachten Sie daher, dass diese Syntax mit älteren Ruby-Versionen nicht funktioniert. Außerdem werden die Tasten Symbole sein. Wenn Sie mit diesen beiden Einschränkungen leben können, funktionieren neue Hashes genauso wie die alten Hashes. Es gibt keinen Grund (außer vielleicht Stil), sie zu konvertieren.

sczizzo
quelle
5
PS: Es ist nicht im JSON-Stil, sondern im JavaScript-Stil. Für JSON müssen Schlüssel in Anführungszeichen gesetzt werden.
Mu ist zu kurz
1

Tun :key => valueist dasselbe wie tun key: valueund ist wirklich nur eine Annehmlichkeit. Ich habe keine anderen Sprachen gesehen, die das verwenden =>, aber andere wie Javascript verwenden das key: valuein ihren Hash-äquivalenten Datentypen.

Was ein Juwel betrifft, um die Art und Weise, wie Sie Ihre Hashes geschrieben haben, umzuwandeln, würde ich mich einfach an die Art und Weise halten, wie Sie es für Ihr aktuelles Projekt tun.

* Beachten Sie, dass bei der Verwendung key: valuedes Schlüssels ein Symbol angezeigt wird und der Zugriff auf den an diesem Schlüssel in einem fooHash gespeicherten Wert weiterhin erfolgt foo[:key].

Charles
quelle
Sowohl Perl als auch PHP verwenden =>. Ich würde vermuten, dass Ruby, stark von Perl inspiriert, die Syntax von Perl ausgeliehen hat :)
Daniel Serodio