2013-04-09 82 views
1

這裏就是我想要做的,大致爲:你能擴展self.included嗎?

module Foo 

    def self.included base 
    base.extend ClassMethods 
    end 

end 

module Bar 
    extend Foo 

    module ClassMethods 
    def hi 
     return "hello!" 
    end 
    end 
end 

class Baz 
    include Bar 
end 

Baz.hi #=> "hello!' 

而是我得到

NoMethodError: undefined method `hi' for Baz:Class 

如果它是不明確的,更普遍的是什麼,我要做的是創建一個包含邏輯一個模塊對於included回調,其中幾個其他模塊然後擴展,並且我希望它們使用來自擴展模塊的included回調(但是,如果例如Bar擴展了Foo,我想self在的封閉中引用,如果可能的話)。

可能這有點令人困惑。

+0

這是令人困惑的,混亂是透明的敵人。爲了維護你的代碼的人,是否有更好的解決方案? – 2013-04-09 14:55:57

回答

0

問題是,我需要確定included而非self.included的酒吧得到included作爲一個類的方法。以下是我想要的:

module Foo 

    def included base 
    base.extend self::ClassMethods 
    end 

end 

module Bar 
    extend Foo 

    module ClassMethods 
    def hi 
     return "hello!" 
    end 
    end 
end 

class Baz 
    include Bar 
end 

Baz.hi #=> "hello!' 
1

您從未在任何地方使用include Foo,因此included掛鉤永遠不會被調用。您需要使用extended掛鉤,因爲你extend Foo

module Foo 
    def self.extended(base) 
    base.define_singleton_method(:included) do |base| 
     base.extend base::ClassMethods 
    end 
    end 
end 

module Bar 
    extend Foo 

    module ClassMethods; def hi; 'hello!' end end 
end 

class Baz; include Bar end 

Baz.hi #=> 'hello!' 
+0

謝謝!儘管我找到了一種我更喜歡的方法,但您的解決方案仍然有效。 – gregates 2013-04-09 16:52:11