2010-05-15 4 views
7

Ok, also habe ich einige Sachen in meinem eigenen DSL mit Ruby verglichen. Ein Konstrukt sie beide Unterstützung ist dieseInkonsistente implizite Hash-Erstellung in Ruby?

x=["key" => "value"] 

den Unterschied zwischen Arrays und Hashes Wissen, würde ich denke, das ist illegal, aber das Ergebnis in Ruby ist

[{"key" => "value"}] 

Warum ist das? Und damit irgendwie Syntax warum können Sie nicht tun

x=("key" => "value") 

Warum ist ein Array ein Sonderfall für implizit erstellt Hashes?

Antwort

2

Ein weiterer Sonderfall ist in einem Funktionsaufruf, betrachten:

def f(x) 
    puts "OK: #{x.inspect}" 
end 
f("foo" => "bar") 
=> OK: {"foo"=>"bar"} 

So in manchen Kontexten kann Hashes implizit gebaut werden (durch den => Operator Erkennung?). Ich nehme an, die Antwort ist nur, dass dies Matz am wenigsten überraschendes Verhalten war.

+0

Wow, das ist sehr seltsam .. – Earlz

+0

Dies ist die nächste Antwort. Es ist nur ein Teil der Syntax. Chatted einige in #RubyOnRails, um zu entdecken, dass es Teil der Ruby-Grammatik ist. – Earlz

0

Ich würde sagen, dass der Interpreter herausfindet, dass "Schlüssel" => "Wert" ein Hash ist, genauso wie es herausfinden würde, dass 5 eine Zahl ist, wenn Sie es in ein Array setzen.
Also, wenn Sie schreiben:

x = [5] 

Der Dolmetscher geht zu denken, ist nicht, dass es ein String ist, und zurück:

x = ["5"] 

Es scheint, dass Rubin schafft implizit Hashes in einigen Fällen.

+0

ja, aber 'x = (5)' und 'x = (" 5 ")' sind alle gültig (die Klammern wurden einfach als mögliche Disambiguation eingefügt) also warum nicht 'x = (" key "=>" value ")' Warum kannst du das in ein Array einfügen, aber nicht direkt in eine Variable? – Earlz

+0

@Earlz - Sie können das nicht direkt in eine Variable einfügen, da es auf diese Weise nicht wie eine Zeichenfolge oder eine Zahl ist. Es zeigt eine Verbindung zwischen 2 Elementen in einem Hash. Es scheint, dass, wenn Sie es in einem Array initialisieren, wandelt es es in einen Hash, aber wenn Sie versuchen, es in eine Variable zu setzen, tut es nicht – bennybdbc

2

Mit dieser scheinbaren Widersprüchlichkeit in impliziter Hash-Erstellung, Rubin erreicht Konsistenz in dieser Hinsicht:

func(whatever...) 

immer mit ersetzt werden:

args = [whatever...] 
func(*args) 

Sie können zwischen Argumentlisten und Arrays konvertieren, und Daher ist es logisch, dass sie dieselbe Syntax haben.