包括模块和嵌入模块有啥区别?

Posted

技术标签:

【中文标题】包括模块和嵌入模块有啥区别?【英文标题】:What is the difference betwen including modules and embedding modules?包括模块和嵌入模块有什么区别? 【发布时间】:2010-10-02 08:31:57 【问题描述】:
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?是否可以从类中调用实例方法?包含模块和嵌入模块有什么区别?为什么以及何时应该这样做?

【问题讨论】:

如果你不介意的话,我添加了一些更精确的标签。 【参考方案1】:

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

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

您可以使用嵌套模块的方法,只需先包含 superpower,然后再包含 fly,如下所示:

Class Superman
    include Superpower
    include Fly
    # ...
end

详情请参阅this blog。

【讨论】:

【参考方案2】:

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

这意味着调用turn_invisible 就像

def run_away
  turn_invisible
end

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

def fly_away
  Fly.flap_wings
end

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

Mixins 解释 here 和 there。

【讨论】:

以上是关于包括模块和嵌入模块有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

“包”和“模块”有啥区别?

函数和模块有啥区别?

KVM、QEMU和KQemu有啥区别

Linux和嵌入式Linux有啥区别

Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]

服务、指令和模块有啥区别?