2014-07-03 6 views
7

Prova quanto segue in IRB: (sto usando Rubino 2.0.0-P247)Come viene creata una variabile locale anche quando la condizione IF è falsa in Ruby?

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

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

blah 
#=> nil 

Sono sorpreso che blah viene assegnato nil anche quando la condizione if restituisce false. Ho pensato che il codice all'interno di if venga saltato poiché la condizione è pari a false.

Qualcuno con conoscenza interna di Ruby può gentilmente spiegare come è successo?

Grazie

risposta

9

variabili locali in Ruby sono creati durante l'analisi /compilation di codice (non di esecuzione). Hanno un ambito lessicale, quindi una variabile locale non è visibile prima della linea a cui è assegnata.

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

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

defined?(foo) linee all'interno di if ritorno nulla, perché non funzionano. Anche l'assegnazione non è stata eseguita. Tuttavia, il compilatore ha visto l'assegnazione alla variabile locale e ne ha creata una (con il valore predefinito di nil).

Questo comportamento spiega il trucco da WAT talk:

a = a # => nil 

Anche se variabile a non esiste, viene creato (e impostare a zero) a destra prima di questa linea, semplicemente perché non c'è un'espressione di assegnazione in il codice (il cui target è una variabile locale ancora sconosciuta). Quindi, quando viene valutata la parte destra di questa espressione, esiste a.

+0

Interessante. Sarebbe bello vedere il YARV corrispondente a questo codice. – Pak

+3

@Pak: qui vai http://pastebin.com/HvNy4u69 –