2009-01-19 158 views
0
module Superpower 

    # instance method 
    def turn_invisible 
     ... 
    end 

    # module method 
    def Superpower.turn_into_toad 
     ... 
    end 

    module Fly 
     def flap_wings 
      ... 
     end 
    end 

end 

Class Superman 
    include Superpower 
    ... 

    def run_away 
     # how to call flap_wings? 
     # how to call turn_invisible? 
    end 

    def see_bad_guys(bad_guy = lex_luthor) 
     #is this correct? 
     Superpower.turn_into_toad(bad_guy) 
    end 
end 

嗨,我看到了一些我無法理解的ruby代碼。你如何從超人班級呼叫flap_wings?是否有可能從類內調用實例方法?包含模塊和嵌入模塊有什麼區別?爲什麼和什麼時候應該這樣做?包括模塊和嵌入模塊有什麼區別?

+0

如果您不介意,我添加了更多標籤以更加精確。 – Keltia 2009-01-19 23:29:34

回答

2

我假設,當你說嵌入模塊時,你的意思是來自你的例子的「飛」模塊嵌入「超級大國」。

如果是這樣的話,我會稱之爲嵌套模塊。我唯一使用嵌套模塊的時候是嵌套模塊專門處理主模塊,這樣Fly中的代碼與Superpower直接相關,但爲了方便和易讀而分開。

你可以簡單地通過包括超級大國首先使用嵌套模塊的方法,再飛第二,像這樣:

Class Superman 
    include Superpower 
    include Fly 
    # ... 
end 

的細節描述上進一步this blog

1

您想閱讀有關mixin的文檔,這是一種解決Ruby僅具有單一繼承的事實的方法。通過在B類的給定模塊A,所有所述的模塊方法是可用的,就好像他們實際上類B的一部分。

這意味着,主叫turn_invisible一樣簡單

def run_away 
    turn_invisible 
end 

對於flap_wings因爲它是在另一個命名空間,它可能是那麼容易,因爲:

def fly_away 
    Fly.flap_wings 
end 

,但我還沒有沒試過來完成你的代碼和「跑」了。

Mixins被解釋爲herethere

相關問題