irb(main)> foo = true unless defined?(Integer)
=> nil
irb(main)> foo = true unless defined?(thisIsUndefined)
=> true
Ihr erster Block zurückkehrt nil
, weil die Art und Weise es Blätter 2 Optionen geschrieben:
foo
ist nicht definiert -> assign wahr
foo
definiert ist -> nichts tun
Hier muss foo definiert werden, wenn die Linie ausgewertet wird. Somit passiert nichts und nil
wird zurückgegeben.
irb(main)> unless defined?(Integer) ; fooo = false ; end
=> nil
irb(main)> unless defined?(thisIsUndefined) ; fooo = false ; end
=> false
Ihr zweiter Block funktioniert genauso wie Ihr erster Block. Wenn fooo
nicht definiert ist, wird der Block eingegeben und fooo
wird auf false
gesetzt. Das Ergebnis der letzten Zeile des Blocks ist der Rückgabewert des Blocks, also der false
, den Sie sehen. Wenn fooo
existiert, dann wird der Block übersprungen und nichts passiert, daher gibt es nichts zurückzugeben, daher die nil
.
Basierend auf Ihrem Code würde ich sagen, dass foo
definiert wurde, als dieser Code ausgeführt wurde und fooo
nicht war (Testcode wurde in Ruby 1.8.6 generiert). Wenn Sie vor dem Ausführen dieses Codes keines dieser Elemente definiert haben, haben Sie möglicherweise ein Element namens foo
, das standardmäßig definiert ist (überprüfen Sie defined?(foo)
selbst). Versuchen Sie es mit einem anderen Namen und sehen Sie, ob Sie die gleichen Ergebnisse erhalten.
Edit:
irb(main)> defined?(bar)
=> nil
irb(main)> bar = true unless defined?(bar)
=> nil
irb(main)> defined?(bar)
=> "local-variable"
Offenbar defined?()
zurückkehrt wahr, da es bereits bar
(am Anfang der Zeile) gesehen hat, auch wenn Sie noch im Prozess der Definition es sind.
Welche Version von Ruby verwenden Sie? – bta
Mit all dem Gerede über die Zuweisung von Variablen, wenn sie nicht bereits definiert sind, fühle ich mich gezwungen, darauf hinzuweisen, dass 'foo || = true' das Gleiche bewirkt (und immer' true' zurückgibt). –
@Allison R. Nicht wenn 'foo' definiert ist, aber falsch. – FMc