ruby - 了解 Ruby 模块行为

标签 ruby module scope

所以我最近才开始编写一些 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. 的情况下调用模块中的函数,而且我永远不会以这种方式编写代码,但我不明白为什么你可以调用 ModuleB 中包含的方法当明确说明 ModuleA 时?

最佳答案

等等,还有更多:

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

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

关于ruby - 了解 Ruby 模块行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15040858/

相关文章:

c# - 如何使用 Ruby 将时间从 .net 纪元转换为 Unix 纪元中的时间?

ruby - 比较 Ruby 中的数组并打印公共(public)元素

c++ - 本地声明的对象的内部内存在范围外完好无损?

javascript - 即使在函数中更新后,全局对象仍未定义

python - for循环中python变量的范围

ruby - FactoryGirl的麻烦

ruby - 如何读取列表(列)而不是行中的 cucumber 表

module - @everywhere 的评估上下文

javascript - 立即调用对象字面量

javascript - 为什么共享模块导入不会失败?