如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?
当前回答
使用定义的?YourVariable 保持简单,傻瓜..;)
其他回答
这里有一些代码,没有火箭科学,但它工作得足够好
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
显然,着色代码是不必要的,在这个玩具示例中只是一个漂亮的可视化。
使用定义的?YourVariable 保持简单,傻瓜..;)
请注意“定义的”和“指定的”之间的区别。
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
X是定义的,即使它从未被赋值!
定义?这很好,但如果你在Rails环境中,你也可以使用try,特别是在你想检查动态变量名的情况下:
foo = 1
my_foo = "foo"
my_bar = "bar"
try(:foo) # => 1
try(:bar) # => nil
try(my_foo) # => 1
try(my_bar) # => nil
警告:常见的Ruby模式
定义的?方法就是答案。见上面接受的答案。
但是要小心……看看下面这个常见的红宝石图案:
def method1
@x ||= method2
end
def method2
nil
end
Method2总是返回nil。 第一次调用method1时,@x变量没有设置——因此method2将运行。而且 Method2将@x设为nil。
但是第二次调用method1时会发生什么呢?
记住@x已经被设置为nil。但是method2仍然会再次运行!!如果method2是一个昂贵的事业,这可能不是你想要的东西。
让定义?救援方法:
def method1
return @x if defined? @x
@x = method2
end
与大多数事情一样,关键在于实现细节。