检查常量是否已经定义

86

这是一个简单的问题,我希望。在下面的示例中,如何检查是否已定义常量?

#this works
var = var||1
puts var
var = var||2
puts var

#this doesn't
CONST = CONST||1
puts CONST
CONST = CONST||2
puts CONST

=> 1
   1
   uninitialized constant CONST (NameError)
3个回答

145
CONST = 2 unless defined? CONST

请参见此处,了解更多关于神奇的defined?运算符的信息。

附言:未来您可能会使用var ||= 1代替var = var||1


6
还有一个const_defined?但它对我没用,不确定为什么。 - Jared Beck
8
const_defined?Module类的一个方法,它可以告诉你常量是否在该模块及其祖先中定义(可选)。请查看文档以获取一些示例- http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F - jibiel
那这个呢?http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F - Donato
感谢您的回答。这是一个很好的解决方法,可以在布尔值无法可靠使用 ||= 的情况下使用。 - Chuck van der Linden
这对方法也同样适用,不仅仅是常量。 - Joshua Pinter

30

1
当您需要动态检查是否定义时,这将特别有帮助。 - DickieBoy

4
CONST ||= :default_value

以上内容适用于我的 Ruby 1.9.3,但在 1.8 上会失败... 嗯,1.8 现在已经过时了。


1.8版本可能已经过时,但在2017年仍在使用,例如:Dreamhost共享主机。 - manitu
我看到大多数项目已经放弃了对Ruby 1.8的支持。我知道仍然有一些“受支持”的Ruby 1.8版本,例如由Red Hat Enterprise Linux提供的版本。它们正在接收安全补丁,但是在安装的任何应用程序中使用的旧gem版本会暴露出许多未知的安全漏洞。所以是的,虽然有,但对大多数人来说并不相关。就像仍然有运行XP的计算机(最近又发现了这样的ATM)一样,还将有很长一段时间。 - akostadinov

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