gpt4 book ai didi

ruby - 为什么 `include` 在顶层表现不同?

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:04 24 4
gpt4 key购买 nike

我使用以下钩子(Hook)来检查在执行 include Foo 时执行包含的模块:

module Foo
def self.included(includer)
puts includer
end
end

Module#include在模块中(通常使用它的地方)与在顶层的行为不同。在模块内部,self是模块,它是 Module 的一个实例.当我调用 include ,执行包含的模块是 what self:

module Bar
puts self # => Bar
include Foo # => includer: Bar
end

在 ruby​​ 脚本的顶层,selfmain ,它是 Object 的一个实例.当我调用 include在顶层,包含的模块是 Object , 什么类self:

puts self    # => main
include Foo # => includer: Object

谁能解释一下为什么?

顶级对象必须是特殊的;如果我调用 to_sinspect在上面,它只是说 main , 但如果我用 Object.new 创建另一个对象并调用to_sinspect在上面,我得到了通常的对象符号:#<Object:0x007fae0a87ac48> .

最佳答案

main比较特殊,有自己定义的include。即它的singleton_class有自己定义的include。证明:

irb(main):017:0> method(:include).owner
=> #<Class:#<Object:0x007fc0398c6468>>
irb(main):018:0> self.singleton_class
=> #<Class:#<Object:0x007fc0398c6468>>

你想到的include是在Module上定义的:

MyClass.method(:include).owner
=> Module

因此,include 在“顶层”表现不同,也就是在我们调用 main 的对象上,原因最简单:它只是一个完全不同的方法比 Module#include

关于ruby - 为什么 `include` 在顶层表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com