2008-10-02 24 views
9

想象一下下面的Ruby模塊:模塊中沒有類的實例方法的目的是什麼?

module Foo 
    def inst_method 
    puts "Called Foo.inst_method" 
    end 
    def self.class_method 
    puts "Called Foo.class_method" 
    end 
end 

顯然Foo.class_method可以稱得上沒有任何類的實例。但是,Foo.inst_method發生了什麼?沒有預先包含/擴展課程,是否可以致電Foo.inst_method

免責聲明:這個問題沒有集中解決一個真正的問題。我只是試圖提高我對Ruby對象系統的理解。

回答

12

模塊內實例方法的主要目的是爲包含它的類提供該功能。

這種方式「混入」模塊最常用作模擬multiple inheritance的方法,或者在其他情況下繼承不是正確的範例(不完美的「是」關係),但是您想要共享行爲。這是保持代碼DRY的另一個工具。

的這個核心Ruby的一個很好的例子指出瞭如何ArrayHash都可以旅行,分類等,他們各自得到來自Enumerable模塊(each_with_indexselectrejectsort多的這種功能在所有定義包含的模塊,不在類中)。

4

我的答案是:「不,你不能調用模塊實例的方法沒有第一延伸或包括一類模塊」

現在知道紅寶石和所有的元編程弄虛作假它包含有可能一個方法來調用它,但它會達到預定可使用模塊

module Tester 
    def inst_meth 
    puts "test inst meth\n" 
    end 

    def self.meth 
    puts "test self meth\n" 
    end 
end 

begin 
    Tester.meth 
rescue; 
    puts $! 
end 
begin 
    Tester.inst_meth 
rescue 
    puts $! 
end 
begin 
    Tester.new.inst_meth 
rescue 
    puts $! 
end 
begin 
    extend Tester 
    inst_meth 
rescue 
    puts $! 
end 
begin 
    include Tester 
    inst_meth 
rescue 
    puts $! 
end 

之外給

>ruby test.rb 
test self meth 
undefined method `inst_meth' for Tester:Module 
undefined method `new' for Tester:Module 
test inst meth 
test inst meth 
相關問題