Betrachten Sie den folgenden irb Ausschnitt aus einer frisch gestarteten Sitzung:Seltsame Bedeutung von || und || = in Ruby (2.0, 1.9.3, 1.7.4 jruby)
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
baz
war eine nicht definierte Variable und versucht, sie zu bewerten produzierten a NameError
. Irgendwie wurde nach dieser Operation jedoch baz
definiert und hat einen Wert von nil
. Scheinbar wurde der Variable nil
die Variable baz
zugewiesen, obwohl niemand (explizit) darum gebeten hat. Gibt es einen zugrunde liegenden Sprachgrund, warum dieses Verhalten wünschenswert ist?
Was ist die Regel, die dieses Verhalten und andere ähnlich verwirrend Konstrukte, wie diese erklärt:
irb:04> true if foo # => NameError
irb:05> foo # => NameError; name still undefined
irb:06> foo = (true if foo) # => nil
irb:07> foo # => nil; name defined as nil
irb:08> true || i = 0 || j = 2 # => i and j are nil; || appears nonlazy
irb:09> raise || quux = 1 # => RuntimeError, quux is nil
Sie verwenden nicht wirklich '|| =' in irgendeinem Ihrer Beispiele, der Fragetitel ist ein wenig irreführend – nzifnab
Noch seltsamer: '>> spam # => NameError; >> spam || = "Eier" # => "Eier"; >> spam # => "Eier" '. Inkonsistent. – iamnotmaynard
mögliches Duplikat von [Verwechslung mit der Zuweisungsoperation innerhalb des Fallacys \ 'if \' block] (http://stackoverflow.com/questions/15183576/confusion-with-the-assignment-operation-inside-the-fallacy-if -block) –