我的某些类在我的Rails应用程序中实现为装饰器,它位于Ruby 1.8.7上。我一直收到警告 - warning: already initialized constant ABC
。这里ABC是常数的名称。
要解决此问题,请使用const_defined?中建议的answer方法。
我的疑问是 - const_defined?
是否正确检查是否已在ruby中定义了类常量?我清楚地看到它可用于检查模块常量。
我能够看到defined?
方法也可以按照answer中的提法使用。我尝试查找defined?
的文档,但到目前为止,我根据搜索功能看不到其文档的链接。
我不确定在两者中选择哪一个,因为我现在看不出两者之间的明显区别。
有人可以建议哪种情况最好用于这种情况以及为什么?
答案 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