2008-12-03 73 views
0

這個問題是最好的概括了一個代碼示例:爲什麼包含模塊的順序在Ruby中有所不同?

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) 

我認爲,當你有一個模塊(例如BarFoo內)所有紅寶石店是事實,Foo包括Bar。所以,當你在Foo上調用方法時,它會在Bar中查找該方法。

如果那是真的,在調用TestTwo::Quux.new.foo的時候,我已經將foo方法混合到TestTwo::Bar中,所以它應該可以正常工作?

回答

3

文檔說append_features(由include調用)將方法混入調用者。所以當TestTwo::Quux包含TestTwo::Bar時,沒有方法被添加到TestTwo::Quux。下一行將方法添加到TestTwo::Bar,但不添加到TestTwo::Quux

+0

這真是一個恥辱,因爲在我的真實情況下,第一個包含發生在我的控制之外,我只是試圖將任何東西混合到包括我的目標模塊中。啊,謝謝:) – Gareth 2008-12-03 13:49:00

相關問題