2013-04-02 12 views
5

Ich frage mich, warum ist a sichtbar?Lokale Variablen in if-Anweisung

if true 
    puts 'true' 
else 
    puts 'false' 
    a = 123 
end 

puts a # no error 

# or 
# my_hash = {key: a} 
# puts my_hash # :key => nil 

Aber dies führt zu einem Fehler, obwohl es wird ‚true‘

if true 
    puts 'true' 
else 
    puts 'false' 
    a = 123 
end 

puts a2 # boooooom 
+2

Siehe akzeptierte Antwort auf [diese Frage] (http://stackoverflow.com/questions/12928050/why-does-ruby-seem-to-hoist-vary-declarations-from-inside-a-case-statement- e? rq = 1 #) –

Antwort

1

a Referenzierung in den if die Wirkung hat, es zu erklären als Variable dargestellt, wenn es keine Methode ist a= definiert für das Objekt.

Da Ruby keine Methoden erfordert, die mit der gleichen Syntax aufgerufen werden, wie eine Variable referenziert oder einer zugewiesen wird, muss eine Beurteilung der Art des betreffenden Tokens vorgenommen werden. Wenn es könnte ein Methodenaufruf sein, weil eine Methode mit diesem Namen definiert wurde, dann wird es als solche interpretiert werden. Wenn zum Zeitpunkt der Kompilierung der Quelle keine solche Methode existiert, wird sie standardmäßig eine Variable sein.

+1

"Wert sollte auf den' if' Block beschränkt werden "? Ich bin mir nicht sicher, was das bedeutet? Variablen sind beschränkt, und "a" ist nicht auf das "if" beschränkt. –

+3

'if' hat keinen Block, nur Klauseln, die bedingt ausgewertet werden. Die Klauseln einer 'if'-Anweisung erstellen keinen neuen Bereich. Das ist nicht C. – sfstewman

+0

Ich habe das 'if' schon immer so behandelt, als wäre es ein Bereich, aber du hast Recht, das scheint nicht der Fall zu sein. C++ - Gewohnheiten weigern sich, wegzugehen. Variablen werden auf die Methode beschränkt, in der sie deklariert sind, oder auf den "Haupt" -Kontext, wenn sie in "irb" steht. – tadman