在Ruby中如何像JavaScript一样测试未定义的变量?

24

在JavaScript中,有一种有用的方法可以测试在任何给定点上从未定义过的变量。例如,以下代码片段将在变量bob未定义时返回true

typeof(bob)=='undefined'

我该如何在Ruby中实现同样的测试?

编辑:我正在寻找紧凑性相等的测试。我已经想出了一些使用异常等笨拙近似方法,但那些并不太好看!

5个回答

45
defined?(variable_name)

irb(main):004:0> defined?(foo)
=> nil
irb(main):005:0> foo = 1
=> 1
irb(main):006:0> defined?(foo)
=> "local-variable"

这里有一篇很好的文章讲述它。


呵呵,谁会想到这么简单。我之前一直在做这样的事情:test = begin does_not_exist rescue NameError "undefined" end - Corban Brook
有趣的是,如果定义了blah,则返回nil而不是false,并且如果定义了,则返回类型字符串。 - Corban Brook
还有一些其他选项,比如object.instance_variable_defined?(:var_name)。在文档中搜索defined?,你会找到更具体的版本。 - jshen
3
"Nil"是假值。您可以使用“if defined?(blah)”进行判断。 - jshen
2
我意识到这似乎很奇怪,因为方法末尾有一个“?”。我本以为会返回布尔值,但实际上得到的是nil或字符串。 - Corban Brook
为了在测试中获得布尔结果,一个好主意可能是 !!defined?(foo)。 - randominstanceOfLivingThing

10

defined?是一个函数,如果该项未定义,则返回nil。

defined? somevar
=> nil
somevar = 12
defined? somevar
=> "local-variable"

所以:

if defined?(somevar)
  do_something
end

3

请记住,如果变量被定义了,defined?将返回一个字符串,如果没有定义,则返回nil,因此应对其结果进行条件检查。我认为该语法暗示它会返回一个布尔值。


正确,但是由于'nil'为falsey并且所有字符串都为真值,因此您可以将返回值视为布尔值用于所有流量控制目的(if,elsif,unless,while,until等)。 - rampion

1

所有可能的情况

irb(main):001:0> defined? ur_variable
=> nil

irb(main):001:0> ur_variable= 12
irb(main):002:0> defined? ur_variable
=> "local-variable"

irb(main):001:0> another_variable = nil
irb(main):002:0> defined? another_variable
=> "local-variable"

-1

也可以用这种方式进行测试。

   if somevar.nil
        # not set do something
    else
        # is set do something else
    end

不对。 "nil" 和 "undefined" 意思不同。 - Jake Stoeffler
如果 defined?(variable_to_test) == nil
puts "variable_to_test 未定义"
else
puts "variable_to_test 已定义"
end => variable_to_test 未定义 variable_to_test = "" if defined?(variable_to_test) == nil puts "variable_to_test 未定义" else puts "variable_to_test 已定义" end => variable_to_test 已定义看起来应该有更简单的方法吧?
- Greg
抱歉,我尝试重新发布并进行了正确的格式化,但失败了。稍后再试。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接