Answers:
使用defined?
关键字(documentation)。它将返回带有项目类型或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?
在该块中定义的变量仍然返回true!
defined?
返回布尔值?
!!defined?(object_name)
如果您希望不执行任何操作但不执行任何操作,则可以创建该控件。
def get_var
@var ||= SomeClass.new()
end
这只会创建一次新实例。之后,它只会不断返回var。
||=
与布尔值一起使用,以免您感到困惑的痛苦。
nil
同时使用,除非您真的想在表达式每次返回时都对其求值nil
var = (var or var.nil?)
以上语句的正确语法为:
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?(var) == nil
呢?
.nil?
正如他们所说,使用to 更为习惯。问一个对象是否nil
比使用比较运算符更“面向对象” 。两者都不难阅读,因此请使用任何一种都可以帮助您运送更多产品。
defined?(your_var)
将工作。根据您的操作,您还可以执行类似的操作your_var.nil?
your_var.nil?
因为它返回true为false,并且比读和写要好得多defined? var
。谢谢你
your_var.nil?
会导致错误:undefined local variable or method your_var
如果在之前未定义...
这是一些代码,没什么火箭科学,但效果很好
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
显然,着色代码不是必需的,只是此玩具示例中的漂亮外观。
nil?
可选。
这是关键的答案:defined?
方法。上面接受的答案很好地说明了这一点。
但是有一条鲨鱼潜伏在海浪下...
考虑这种常见的红宝石图案:
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
因为它返回一个布尔值。
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
声明似乎过于复杂
如许多其他示例所示,您实际上不需要从方法中获取布尔值就可以在ruby中进行逻辑选择。除非您确实需要布尔值,否则将所有内容强制为布尔值将是一种糟糕的形式。
但是,如果您绝对需要布尔值。采用 !!(bang bang)或“ falsy falsy揭示了事实”。
› 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
这是一个重要的示例,因为它依赖于布尔值对其字符串表示形式的隐式强制。
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
应该提到的是,defined
用于检查哈希中是否设置了特定字段的行为可能会发生意外:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
语法在这里是正确的,但是defined? var['unknown']
将被评估为string "method"
,因此if
将执行该块
编辑:检查哈希中是否存在键的正确表示法是:
if var.key?('unknown')
请注意“已定义”和“已分配”之间的区别。
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
即使从未定义x,它也已定义!
NameError Exception: undefined local variable or method
,并且当变量的唯一赋值/提及是在if块中没有被击中时感到困惑。
nil
已初始化。