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

时间:2009-01-19 23:21:18

标签: ruby module mixins oop

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?是否可以从类中调用实例方法?包含模块和嵌入模块有什么区别?为什么以及何时应该这样做?

2 个答案:

答案 0 :(得分:2)

我假设当您说嵌入模块时,您的意思是“示例”中的“Fly”模块嵌入在“Superpower”中。

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

你可以使用嵌套模块的方法,只需先包含超级大国,然后再飞第二,就像这样:

Class Superman
    include Superpower
    include Fly
    # ...
end

详情请见this blog

答案 1 :(得分:1)

您想阅读有关mixins的文档,这是解决Ruby只有单一继承这一事实的方法。通过在B类中包含给定的模块A,A中的所有模块方法都可用,就像它们实际上是B类的一部分一样。

这意味着调用turn_invisible就像

一样简单
def run_away
  turn_invisible
end

对于flap_wings,因为它在另一个命名空间中,它可能很简单:

def fly_away
  Fly.flap_wings
end

但我并没有尝试完成你的代码并“运行”它。

对Mixins进行了解释herethere