4

所以我最近才开始写一些 Ruby,虽然我了解模块是如何工作的,但以下行为仍然让我感到厌烦。

module ModuleA
    def a_greet
        'Hello from module A'
    end
end


module ModuleB
    def b_greet
        'Hello from module B'
    end
end


include ModuleA
include ModuleB

# WHY DOES THIS WORK !!!!!
p ModuleA.b_greet

我知道可以在不指定的情况下调用模块中的函数,Module.并且我永远不会以这种方式编写代码,但是我不明白为什么在显式声明 ModuleA 时可以调用 ModuleB 中包含的方法?

4

1 回答 1

7

等等,还有更多:

"Why does this work?".b_greet # => "Hello from module B"

您将这些模块包含在顶级对象main中。它是一个特殊的对象:在其上定义的所有方法都可用于所有对象(参见上面的行,现在b_greeta 上有方法String)。ModuleA也是一个对象,所以当你 include 时ModuleBModuleA会得到它的方法。如果您将这些模块包含在常规类/对象中,您将不会获得这种“共享”行为。

于 2013-02-23T13:10:10.107 回答