2

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

为了解决这个问题,我使用了const_defined? 答案中建议的方法。

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

我能够看到该defined?方法也可以按照此答案中的说明使用。我试图查找 的文档defined?,但到目前为止,根据我的搜索,我没有看到指向其文档的链接。

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

有人可以建议在这种情况下最好使用哪种方法,为什么?

4

3 回答 3

4

关键字在此处defined?记录。

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

于 2014-09-01T15:12:51.613 回答
1

还有一种选择。这是因为 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
于 2014-09-01T15:56:25.407 回答
0

由于您使用的是 Ruby 1.8.7,因此您唯一的选择是const_defined?,因为我找不到任何文档defined?

如果您使用的是 Ruby 1.9,我建议您使用定义的?并查看此文档以获取更多信息。

于 2014-09-01T15:18:09.647 回答