如何检查Ruby中是否定义了变量?有isset
可用的类型方法吗?
使用defined?
关键字(文档).它将返回一个带有项目类型的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"
如果您确实存在则不执行任何操作,但如果它不存在则创建它,这将非常有用.
def get_var @var ||= SomeClass.new() end
这只会创建一次新实例.之后它只是继续返回var.
上述语句的正确语法是:
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
用你的变量替换().此语法将在if语句中返回true/false值以进行评估.
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
保持简单傻 ..;)
这里有一些代码,没有什么火箭科学,但它运作得很好
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
显然,着色代码不是必需的,只是这个玩具示例中的一个很好的视觉效果.
这是关键答案:defined?
方法.上面接受的答案完美地说明了这一点
但是有一条鲨鱼潜伏在海浪下面......
考虑这种类型的常见ruby模式:
def method1 @x ||= method2 end def method2 nil end
method2
总是回来nil
.第一次调用时method1
,@x
变量未设置 - 因此method2
将运行.并且method2
将设置@x
到nil
.那很好,一切都很好.但是第二次打电话会发生什么method1
?
记住@x已经设置为nil.But method2
仍将再次运行!! 如果method2是一项代价高昂的工作,那么这可能不是您想要的.
让defined?
方法得到解决 - 使用此解决方案,处理特定情况 - 使用以下内容:
def method1 return @x if defined? @x @x = method2 end
魔鬼在细节中:但是你可以用这种defined?
方法躲避潜伏的鲨鱼.
你可以试试:
unless defined?(var) #ruby code goes here end => true
因为它返回一个布尔值.