爲什麼不能正常工作?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中。它可以工作,如果我刪除模塊包裝。
爲什麼不能正常工作?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中。它可以工作,如果我刪除模塊包裝。
您正在定義XT::Fixnum
,而不是Fixnum
。
正如@Jeremy所寫,常量被模塊命名空間,定義一個類實際上只是將一個類對象分配給一個常量。基本上,
class Fixnum; end
爲(大約)相當於
Fixnum = Class.new
(除了一個事實,如果Fixnum
已經存在,前者將重新打開它,而後者將覆蓋它)。
這意味着如果你在模塊(或類,自IS-A類模塊)內部執行該操作,常量Fixnum
將在該模塊內命名空間。
如果你想明確地訪問一個頂級常量,你可以告訴Ruby在頂層開始它的查找,就像你告訴Unix在頂層啓動文件系統查找一樣:
module XT
class ::Fixnum; end
end