【发布时间】:2016-01-01 10:38:04
【问题描述】:
当我执行include Foo 时,我使用了以下钩子来检查正在执行包含的模块:
module Foo
def self.included(includer)
puts includer
end
end
Module#include 在模块(通常使用它的地方)与在顶层的行为不同。在模块内部,self 是模块,它是Module 的一个实例。当我调用include 时,执行包含的模块是self 是什么:
module Bar
puts self # => Bar
include Foo # => includer: Bar
end
在 ruby 脚本的顶层,self 是 main,它是 Object 的一个实例。当我在顶层调用include 时,包含的模块是Object,self 的类是:
puts self # => main
include Foo # => includer: Object
谁能解释一下原因?
顶层对象必须是特殊的;如果我在上面调用to_s 或inspect,它只会显示main,但如果我使用Object.new 创建另一个对象并调用to_s 或inspect,我会得到通常的对象符号:@ 987654344@.
【问题讨论】:
-
通过
Module#included的文档,它接收到调用Module#include的模块或类对象。 -
"main" 是 Ruby 程序的特殊顶级 Object 实例和初始执行上下文。它在内部定义的方法成为其(私有)实例方法方面也很特殊。
-
对象没有
include方法,只有模块有。main是Object的一个实例,而Module不在祖先中。它必须是include的特殊单例方法版本,仅适用于main,对吧? -
特别的是
main,而不是include。 -
红宝石“顶级”有点奇怪和独特,它有时表现得像 Object 的实例,有时又像 Object 类。 banisterfiend.wordpress.com/2010/11/23/…