2014-09-01 59 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 
相關問題