2009-05-20 5 views
22

In JavaScript gibt es eine nützliche Möglichkeit, nach einer Variablen zu suchen, die zu keinem Zeitpunkt definiert wurde. Zum Beispiel, kehrt der folgende Code-Snippet wahr wenn die Variable bob nicht definiert wurde:Testen auf undefinierte Variablen in Ruby a la JavaScript?

typeof(bob)=='undefined' 

Wie erreichen wir den gleichen Test in Ruby?

edit: Ich bin auf der Suche nach einem Test, der in der Natur gleichermaßen kompakt ist. Ich habe einige peinliche Näherungen mit Ausnahmen und so, aber die sind nicht sehr hübsch!

Antwort

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" 

Hier ist eine gute write up drauf.

+0

heheh, die es so einfach sein gewusst hätte wäre. Ich tat Dinge wie: test = beginnen does_not_exist Rettungsnameerror „undefiniert“ Ende –

+0

interessant, dass definiert? blah gibt nil und nicht false zurück und gibt eine Zeichenfolge vom Typ –

+0

zurück. Es gibt noch weitere Optionen wie object.instance_variable_defined? (: var_name). Suche in den Dokumenten für definiert? und Sie werden die spezifischeren Versionen finden. – jshen

8

defined? ist eine Funktion, die nil zurückgibt, wenn das Element nicht definiert ist.

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

So:

if defined?(somevar) 
    do_something 
end 
3

Denken Sie daran, die definiert? Gibt eine Zeichenfolge zurück, wenn die Variable definiert ist. Wenn dies nicht der Fall ist, verwenden Sie eine bedingte Überprüfung der Ergebnisse. Ich denke, dass die Syntax darauf hinweist, dass es einen booleschen Wert zurückgeben würde.

+0

Richtig, aber da 'nil' falsch ist und alle Strings truthy sind Sie können die Rückgabewerte wie boolesche Werte für alle Flusssteuerungszwecke behandeln (wenn, elsif, außer, while, bis, usw.). – rampion

-1

Kann auch auf diese Weise testen.

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

Nein. "Null" und "undefiniert" bedeuten zwei verschiedene Dinge. –

+0

wenn definiert? (Variable_to_test) == null puts "variable_to_test ist undefiniert" sonst puts "variable_to_test definiert ist" Ende => variable_to_test undefiniert ist variable_to_test = "" wenn definiert? (Variable_to_test) = = nil puts „variable_to_test ist nicht definiert“ sonst puts „variable_to_test definiert“ Ende => variable_to_test definiert ist Scheint, wie es sollte ein einfacher Weg sein? – Greg

+0

Sorry, habe versucht, mit korrekter Formatierung neu zu schreiben und ist fehlgeschlagen. Später – Greg

0

Alle Anwendungsfälle:

defined? ur_variable 
=> nil 

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

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