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


当前回答

使用定义的?关键字(文档)。它将返回一个包含项目类型的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"

其他回答

应该提到的是,使用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?

警告:常见的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

与大多数事情一样,关键在于实现细节。

此外,你可以检查它是否通过插值在字符串中定义,如果你编码:

puts "Is array1 defined and what type is it? #{defined?(@array1)}"

如果定义了类型,系统会告诉您。 如果没有定义,它将返回一个警告,说变量没有初始化。

希望这能有所帮助!:)

上述语句的正确语法是:

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语句的计算。