检查Ruby类中是否已定义常量的正确方法

时间:2014-09-01 15:01:56

标签: ruby constants ruby-1.8.7 class-constants

我的某些类在我的Rails应用程序中实现为装饰器,它位于Ruby 1.8.7上。我一直收到警告 - warning: already initialized constant ABC。这里ABC是常数的名称。

要解决此问题,请使用const_defined?中建议的answer方法。

我的疑问是 - const_defined?是否正确检查是否已在ruby中定义了类常量?我清楚地看到它可用于检查模块常量。

我能够看到defined?方法也可以按照answer中的提法使用。我尝试查找defined?的文档,但到目前为止,我根据搜索功能看不到其文档的链接。

我不确定在两者中选择哪一个,因为我现在看不出两者之间的明显区别。

有人可以建议哪种情况最好用于这种情况以及为什么?

3 个答案:

答案 0 :(得分:2)

关键字defined?已记录在案here

最好询问它是否为常数,如果重要的是常量,则使用const_defined?。如果您只关心它是否已定义,请使用关键字defined?

答案 1 :(得分:0)

由于您使用的是Ruby 1.8.7,因此我看起来唯一的选择是const_defined?,因为我找不到defined?

中的任何文档

如果我们使用的是Ruby 1.9,我建议使用定义的?并查看this document以获取更多信息。

答案 2 :(得分:0)

还有一个选择。这是因为Ruby有这种令人讨厌的#const_missing方法,即使在那里也会意外地提供值,其中#const_defined?表示 false

module M
  def self.const_missing sym; 42 end
end

M.const_defined? "A" #=> false
M::A #=> 42

对于这些情况,您可以使用begin ... rescue ... end声明:

begin
  M::A; true
rescue NameError
  false
end
#=> true