2010-12-23 51 views
1

爲什麼不能正常工作?Ruby:從模塊中重新打開一個類

module XT 
    puts Fixnum.class # So we're sure to re-open the Fixnum class 
    class Fixnum 
    def hi 
     puts "HI from module XT" 
    end 
    end 
end 

在要求和加載模塊後,hi方法仍未添加到Fixnum中。它可以工作,如果我刪除模塊包裝。

回答

4

您正在定義XT::Fixnum,而不是Fixnum

6

正如@Jeremy所寫,常量被模塊命名空間,定義一個類實際上只是將一個類對象分配給一個常量。基本上,

class Fixnum; end 

爲(大約)相當於

Fixnum = Class.new 

(除了一個事實,如果Fixnum已經存在,前者將重新打開它,而後者將覆蓋它)。

這意味着如果你在模塊(或類,自IS-A類模塊)內部執行該操作,常量Fixnum將在該模塊內命名空間。

如果你想明確地訪問一個頂級常量,你可以告訴Ruby在頂層開始它的查找,就像你告訴Unix在頂層啓動文件系統查找一樣:

module XT 
    class ::Fixnum; end 
end