2009-05-20 13 views
22

In JavaScript c'è un modo utile per testare una variabile che non è mai stata definita in un dato punto. Ad esempio, il seguente frammento di codice restituirà vero se la variabile bob non è stato definito:Test per variabili non definite in Ruby a la JavaScript?

typeof(bob)=='undefined' 

Come faccio a compiere la stessa prova in Ruby?

modifica: Sto cercando un test che sia ugualmente compatto in natura. Ho trovato alcune approssimazioni imbarazzanti usando eccezioni e simili, ma quelle non sono molto belle!

risposta

43
defined?(variable_name) 

irb(main):004:0> defined?(foo) 
=> nil 
irb(main):005:0> foo = 1 
=> 1 
irb(main):006:0> defined?(foo) 
=> "local-variable" 

Ecco un buon write up su di esso.

+0

eheheh, che avrebbe saputo che sarebbe stato così facile. Stavo facendo cose del genere: prova = iniziare does_not_exist salvataggio NameError "indefinito" fine –

+0

interessante quella definita? blah restituisce nil e non false e restituisce una stringa di tipo se è definita –

+0

Ci sono alcune altre opzioni come object.instance_variable_defined? (: var_name). Cerca nei documenti per definito? e troverai le versioni più specifiche. – jshen

8

defined? è una funzione che restituisce zero se l'elemento non è definito.

defined? somevar 
=> nil 
somevar = 12 
defined? somevar 
=> "local-variable" 

Quindi:

if defined?(somevar) 
    do_something 
end 
3

Tenete a mente che ha definito? restituisce una stringa se la variabile è definita, nil se non lo è, quindi usa il controllo condizionale sui suoi risultati. Penso che la sintassi alluda che restituirebbe un valore booleano.

+0

Vero, ma poiché 'nil' è falso e tutte le stringhe sono veritiere , puoi trattare i valori di ritorno come i booleani per tutti gli scopi di controllo del flusso (se, elsif, a meno che, while, until, ecc.). – rampion

-1

Può anche verificare in questo modo.

if somevar.nil 
     # not set do something 
    else 
     # is set do something else 
    end 
+0

No. "nil" e "indefinito" significano due cose diverse. –

+0

se definito? (Variable_to_test) == nil puts "variable_to_test non è definito" altro puts "variable_to_test è definito" fine => variable_to_test è indefinito variable_to_test = "" se definito? (Variable_to_test) = = nil puts "variable_to_test non è definito" altro puts "variable_to_test è definito" fine è definito => variable_to_test sembra che ci dovrebbe essere un modo più semplice? – Greg

+0

Spiacente, ho provato a ripubblicare con una formattazione corretta e fallito. Dopo – Greg

0

Tutti i casi di utilizzo:

defined? ur_variable 
=> nil 

ur_variable= 12 
defined? ur_variable 
=> "local-variable" 

another_variable = nil 
defined? another_variable 
=> "local-variable"