2010-11-02 89 views
1

我有一個方法,我想添加到一個類的Rails應用程序。我想它分成模塊,像這樣:我可以添加到模塊內部的類定義嗎?

module Hah 
    class String 
    def hurp 
     "hurp durp" 
    end 
    end 
end 
#make sure the file containing the module is loaded correctly. 
puts "Yup, we loaded" 

#separate file 
include Hah 
"foobar".hurp 
#should be "hurp durp" 

我知道包含模塊被正確加載,因爲puts打印正確,當我包含文件的文件,但我得到一個錯誤:

undefined method `hurp' for "foobar":String 

那麼我該如何做到這一點?

回答

3
module Hah 
    class String 
    #... 
    end 
end 

大致等同於:

class Hah::String 
    #... 
end 

這使得一類Hah::String,不引用類String在全局命名空間。請注意,後者僅適用於已申報module Hah(關於module關鍵字,Module.new等),而前者聲明或重新打開module Hah,然後在該範圍內聲明或重新打開class String,其中上下文隱含爲class Hah::String

要在全局命名空間打開類String,使用方法:

module Hah 
    class ::String 
    #... 
    end 
end 

因爲::String引用類String嚴格頂層/全局命名空間。

+1

哇。在這個答案中有很多新東西給我(這解決了我的問題)。所以一個模塊創建一個新的名稱空間,::是範圍解析運算符,並且:: 在全局名稱空間中引用? – jergason 2010-11-02 16:21:55

+0

@Jergason:一切正確。 – Chuck 2010-11-02 16:47:37

+0

@Jergason:類也是模塊,因此也創建命名空間。 (實際上,類和模塊實際上只是分配給常量的對象,因此,模塊和類充當常量的名稱空間。) – 2010-11-02 17:14:58

相關問題