如何检查一个变量是否在Ruby中定义?是否有isset类型的方法可用?


当前回答

定义?(your_var)将工作。取决于你在做什么你也可以做your_var。nil?

其他回答

这里有一些代码,没有火箭科学,但它工作得足够好

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

显然,着色代码是不必要的,在这个玩具示例中只是一个漂亮的可视化。

请注意“定义的”和“指定的”之间的区别。

$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"

X是定义的,即使它从未被赋值!

上述语句的正确语法是:

if (defined?(var)).nil? # will now return true or false
 print "var is not defined\n".color(:red)
else
 print "var is defined\n".color(:green)
end

用变量替换(var)。该语法将返回一个true/false值,用于if语句的计算。

你可以试试:

unless defined?(var)
  #ruby code goes here
end
=> true

因为它返回一个布尔值。

使用定义的?关键字(文档)。它将返回一个包含项目类型的String,如果不存在则返回nil。

>> a = 1
 => 1
>> defined? a
 => "local-variable"
>> defined? b
 => nil
>> defined? nil
 => "nil"
>> defined? String
 => "constant"
>> defined? 1
 => "expression"

正如skalee评论的那样:“值得注意的是,设置为nil的变量是初始化的。”

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