如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?
当前回答
你可以试试:
unless defined?(var)
#ruby code goes here
end
=> true
因为它返回一个布尔值。
其他回答
你可以试试:
unless defined?(var)
#ruby code goes here
end
=> true
因为它返回一个布尔值。
应该提到的是,使用defined来检查一个特定的字段是否在哈希中设置,可能会产生意想不到的行为:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
这里的语法是正确的,但定义?Var ['unknown']将被求值为字符串"method",因此if块将被执行
检查哈希中是否存在键的正确符号是:
if var.key?('unknown')
定义?(your_var)将工作。取决于你在做什么你也可以做your_var。nil?
留下一个非常简单的例子,以防有用。
当变量不存在时:
if defined? a then "hi" end
# => nil
当变量存在时:
a = 2
if defined? a then "hi" end
# => "hi"
警告:常见的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
与大多数事情一样,关键在于实现细节。