2013-04-02 18 views
5

Mi chiedo, perché è visibile a?Variabili locali all'interno dell'istruzione if

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

puts a # no error 

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

Ma questo causa un errore, anche se ci saranno 'vero' mostrato

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

puts a2 # boooooom 
+2

Vedi risposta accettata su [questa domanda] (http://stackoverflow.com/questions/12928050/why-does-ruby-seem-to-hoist-variable-declarations-from-inside-a-case-statement- e? rq = 1 #) Il valore " –

risposta

1

Riferimento a all'interno if ha l'effetto di dichiarare come variabile se non esiste un metodo a= definita per l'oggetto.

Poiché Ruby non richiede che i metodi vengano chiamati utilizzando la stessa sintassi del riferimento a una variabile o dell'assegnazione a uno, è necessario effettuare una valutazione sulla natura del token in questione. Se potrebbe essere essere una chiamata di metodo perché è stato definito un metodo con quel nome, quindi verrà interpretato come tale. Se non esiste un tale metodo al momento della compilazione della fonte, allora sarà una variabile per impostazione predefinita.

+1

" deve essere applicato al blocco "if'"? Non sono sicuro di cosa significhi? Le variabili hanno scope, e 'a' non ha scope per il' if'. –

+3

'if' non ha alcun blocco, solo le clausole che vengono valutate condizionalmente. Le clausole di un'istruzione 'if' non creano un nuovo ambito. Questo non è C. – sfstewman

+0

Ho sempre trattato il 'se' come se fosse ambito, ma hai ragione, non sembra essere il caso. Le abitudini C++ si rifiutano di andare via. Le variabili verranno esaminate in base al metodo da loro dichiarato all'interno o al contesto 'main' se in' irb'. – tadman