检查variables是否被定义?

我如何检查一个variables是否在Ruby中定义? 是否有isset type方法?

使用defined? 关键字( 文档 )。 它会返回一个Stringtypes的项目,如果不存在,则返回nil

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

正如skalee所评论的那样:“值得注意的是,设置为零的variables被初始化。

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

如果你不想做任何事,如果它确实存在,那么这很有用,但是如果它不存在就创build它。

 def get_var @var ||= SomeClass.new() end 

这只创build一次新的实例。 之后,它只是不断返回变种。

上述语句的正确语法是:

 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 

用你的variables代替( var )。 这个语法将在if语句中返回一个真/假评估值。

defined?(your_var)将工作。 根据你在做什么,你也可以做一些像your_var.nil?

尝试“除非”而不是“如果”

 a = "apple" # Note that b is not declared c = nil unless defined? a puts "a is not defined" end unless defined? b puts "b is not defined" end unless defined? c puts "c is not defined" end 

使用defined? YourVariable defined? 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 

显然,着色代码是没有必要的,只是在这个玩具的例子很好的visualation。

你可以试试:

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

因为它返回一个布尔值。

请注意区分“定义”和“分配”。

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

即使它从未被分配,x也被定义!

正如许多其他示例所示,您实际上并不需要从方法中进行逻辑select的布尔值。 除非你真的需要一个布尔值,否则将一切强制为一个布尔值将是一个糟糕的forms。

但是,如果你绝对需要一个布尔值。 使用 !! (b))或“f f f reveals揭示真相”。

 › irb >> a = nil => nil >> defined?(a) => "local-variable" >> defined?(b) => nil >> !!defined?(a) => true >> !!defined?(b) => false 

为什么它通常不支付强制:

 >> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) => true 

这里有一个很重要的例子,因为它依赖于布尔值的隐式强制来表示string。

 >> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}" var is defined? true vs local-variable => nil 

这是关键的答案:定义? 方法。 上面接受的答案完美地说明了这一点

但是有一个潜伏在海浪下的鲨鱼

考虑这种常见的ruby模式:

  def method1 @x ||= method2 end def method2 nil end 

我们停下来想一想。 方法2总是返回nil。 第一次调用method1时,@xvariables没有被设置 – 因此方法2将被运行。 方法2将@x设置为零。 这很好,一切顺利。 但是,第二次调用method1会发生什么?

记得@x已经被设置为零。 但方法2仍然会再次运行? 如果method2是一个昂贵的工作,这可能不是你想要的东西。

让定义? 方法来救援

  def method1 return @x if defined? @x @x = method2 end 

如果你不知道那个技巧,那么“你会需要一个更大的船”。

应该提到的是,使用defined来检查在哈希中是否设置了特定字段可能会出现意想不到的情况:

 var = {} if defined? var['unknown'] puts 'this is unexpected' end # will output "this is unexpected" 

这里的语法是正确的,但defined? var['unknown'] defined? var['unknown']将被评估为string"method" ,所以if块将被执行

另外,你可以通过插值来检查它是否在string中定义,如果你编码:

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

系统会告诉你这个types是否被定义。 如果没有定义它将只会返回一个警告说variables没有被初始化。

希望这可以帮助! 🙂