这个问题最好总结一下代码示例:
module TestOne
module Foo
def foo
42
end
end
module Bar
include Foo
end
class Quux
include Bar
end
end
TestOne::Bar.ancestors # => [TestOne::Bar, TestOne::Foo]
TestOne::Quux.ancestors # => [TestOne::Quux, TestOne::Bar, TestOne::Foo, Object, Kernel]
TestOne::Quux.new.foo # => 42
module TestTwo
class Quux
end
module Bar
end
module Foo
def foo
42
end
end
end
TestTwo::Quux.send :include, TestTwo::Bar
TestTwo::Bar.send :include, TestTwo::Foo
TestTwo::Bar.ancestors # => [TestTwo::Bar, TestTwo::Foo]
TestTwo::Quux.ancestors # => [TestTwo::Quux, TestTwo::Bar, Object, Kernel]
TestTwo::Quux.new.foo # =>
# ~> -:40: undefined method `foo' for #<TestTwo::Quux:0x24054> (NoMethodError)
我认为当你在一个类Bar
中包含一个模块(例如Foo
)时,Ruby存储的所有内容都是Foo
包含Bar
的事实。因此,当您在Foo上调用方法时,它会在Bar
中查找该方法。
如果确实如此,那么在TestTwo::Quux.new.foo
被调用的时候我已将foo
方法混合到TestTwo::Bar
中,所以它应该有效,对吗?
答案 0 :(得分:3)
文档说append_features(由include调用)将方法混合到调用者中。因此,当TestTwo::Quux
包含TestTwo::Bar
时,TestTwo::Quux
不会添加任何方法。下一行将方法添加到TestTwo::Bar
,但不添加到TestTwo::Quux
。