2014-07-03 7 views
7

Versuchen Sie Folgendes in irb: (Ich bin mit Ruby 2.0.0-S. 247)Wie wird eine lokale Variable erstellt, selbst wenn die IF-Bedingung in Ruby zu false ausgewertet wird?

blah 
#=> NameError: undefined local variable or method `blah' for main:Object 

if false 
    blah = 'blah' 
end 
#=> nil 

blah 
#=> nil 

Ich bin überrascht, dass blahnil selbst zugewiesen wird, wenn der if Zustand false auswertet. Ich dachte, der Code innerhalb if wird übersprungen, da die Bedingung false auswertet.

Könnte jemand mit Ruby Interna Wissen erklären, wie das passiert ist?

Danke

Antwort

9

Lokale Variablen in Ruby während Parsing/Kompilation von Code (nicht Ausführung) erstellt werden. Sie sind lexikalisch begrenzt, daher ist eine lokale Variable vor der Zeile, der sie zugewiesen ist, nicht sichtbar.

defined?(foo) # => nil 
if false 
    defined?(foo) # => 
    foo = 'blah' 
    defined?(foo) # => 
end 

defined?(foo) # => "local-variable" 
foo # => nil 

defined?(foo) Linien innerhalb von if Rückkehr nichts, denn sie laufen nicht. Die Zuordnung wurde nicht ausgeführt. Der Compiler erkannte jedoch die Zuweisung zur lokalen Variablen und erstellte eine (mit dem Standardwert nil).

Dieses Verhalten erklärt den Trick von WAT talk:

a = a # => nil 

Obwohl variable a nicht existiert, wird sie erstellt (und auf Null gesetzt) ​​vor dieser Zeile rechts, einfach weil es ist ein Ausdruck Zuordnung in der Code (Ziel dessen ist noch unbekannte lokale Variable). Wenn also die rechte Seite dieses Ausdrucks ausgewertet wird, existiert a.

+0

Interessant. Es wäre schön, den YARV zu sehen, der diesem Code entspricht. – Pak

+3

@Pak: Da gehst du http://pastebin.com/HvNy4u69 –

Verwandte Themen