我有一些基于这个答案的代码: https: //stackoverflow.com/a/2136117/2158544。本质上它看起来像这样(注意:在实际代码中,我不控制模块A):
module A
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def singleton_test
end
end
end
module B
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def self.extended(base)
puts base.method(:singleton_test).owner
define_method(:singleton_test) do |*args, &blk|
super(*args, &blk)
end
end
end
end
第一个包含:
class C
include A
include B
end
A::ClassMethods # <- output
第二个包含:
class D
include A
include B
end
B::ClassMethods # <- output
尽管对 的调用super
仍然被正确路由到module A
,但我很困惑为什么singleton_test
当它被包含到class D
(owner is B::ClassMethods
) 中时已经“包装”了。我的理论是,这是因为当module B
重新定义时singleton_test
,它是在包含的模块级别(module A
)上重新定义它,因此每次module A
随后包含时,该方法已经被“包装”。