包括模块和嵌入模块有什么区别?

问题描述:

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

我假设,当你说嵌入模块时,你的意思是来自你的例子的“飞”模块嵌入“超级大国”。

如果是这样的话,我会称之为嵌套模块。我唯一使用嵌套模块的时候是嵌套模块专门处理主模块,这样Fly中的代码与Superpower直接相关,但为了方便和易读而分开。

你可以简单地通过包括超级大国首先使用嵌套模块的方法,再飞第二,像这样:

Class Superman 
    include Superpower 
    include Fly 
    # ... 
end 

的细节描述上进一步this blog

您想阅读有关mixin的文档,这是一种解决Ruby仅具有单一继承的事实的方法。通过在B类的给定模块A,所有所述的模块方法是可用的,就好像他们实际上类B的一部分。

这意味着,主叫turn_invisible一样简单

def run_away 
    turn_invisible 
end 

对于flap_wings因为它是在另一个命名空间,它可能是那么容易,因为:

def fly_away 
    Fly.flap_wings 
end 

,但我还没有没试过来完成你的代码和“跑”了。

Mixins被解释为herethere