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


当前回答

正如许多其他示例所示,在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"

这里的语法是正确的,但定义?Var ['unknown']将被求值为字符串"method",因此if块将被执行

检查哈希中是否存在键的正确符号是:

if var.key?('unknown')

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

留下一个非常简单的例子,以防有用。

当变量不存在时:

if defined? a then "hi" end
# => nil

当变量存在时:

a = 2
if defined? a then "hi" end
# => "hi"

正如许多其他示例所示,在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

请注意“定义的”和“指定的”之间的区别。

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

X是定义的,即使它从未被赋值!