检查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没有被初始化。
希望这可以帮助! 🙂