2014-09-01 60 views
2

我在Ruby 1.8.7的Rails应用程序中有一些实现为装饰器的类。我不断收到警告 - warning: already initialized constant ABC。这里ABC是常数的名字。正确的方法来检查是否已经在Ruby类中定义了一个常量

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

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

我能够看到defined?方法也可以用在这个answer中提到的方法。我试图查找defined?的文档,但到目前为止我没有看到基于我的搜索的文档链接。

我不确定在两者中选择哪一个,因为在这一点上我看不出两者之间有明显差异。

请问一个人可以建议哪种最适合在这种情况下使用,为什么?

+0

这可以帮助:http://stackoverflow.com/q/3398590/477037 – Stefan 2014-09-01 15:11:40

回答

2

关键字defined?记录在here

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

+0

感谢您的答案。我使用的是Ruby 1.8.7,如果存在,可以请我指出一个特定于这个ruby版本的文档。使用const_defined?方法内的方法不应该是一个问题?我看到它的作品,但我问这个问题的原因是,const_defined?更多的听起来像使用模块的东西比类,因为它是在['模块'相关文档](http://ruby-doc.org/core-1.8.7/Module.html#method-i-const_defined -3F),我有些怀疑。你能确认吗?谢谢。 – boddhisattva 2014-09-01 15:50:44

+0

@boddhisattva,不要使用Ruby 1.8.7,它已经过时了。我的意思是非常糟糕。使用Ruby 2.x,我求求你。 – 2014-09-01 15:51:55

+1

@BorisStitnicky:这些人甚至得到*红宝石1.8?就我所知,每个主要发行版都已更新。即使是OSX! – 2014-09-01 15:54:23

0

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

如果任何文件你我们使用Ruby 1.9我会建议使用定义的?并检查this document获取更多信息。

+1

这是因为'defined?'不是一种方法。这是一个类似于运营商的关键字。 – 2014-09-01 15:58:42

0

还有一个选项。这是因为Ruby有这个讨厌的#const_missing方法,可以出乎意料地提供价值,即使在那里,#const_defined?将表明

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 
相关问题