2011-07-08 69 views
2

考慮下面的代碼:使ClassMethods也可作爲具有的ActiveSupport模塊功能::關注

module Foo 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def foo 
     puts 'foo' 
    end 
    end 
end 

class Bar 
    include Foo 
end 

我想要做的就是調用Foo.foo而不是Bar.foo。有時在原始模塊上調用類方法會感覺更自然,尤其是當該功能與所包含的類無關時,可以更好地描述原始模塊名稱。

回答

5

這似乎是一種代碼味道。話雖如此,你可以讓Foo模塊使用類方法擴展自己:

module Foo 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def foo 
     puts 'foo' 
    end 
    end 

    extend ClassMethods 
end 

class Bar 
    include Foo 
end 

Bar.foo 
Foo.foo 
+0

它工作的很好,謝謝!順便說一句,你爲什麼認爲代碼味道? – kenn

+0

讓模塊從定義爲類方法的模塊自身擴展看起來不太合適。通常情況下,如果你想訪問Foo的foo方法,你只需要執行'Foo :: ClassMethods.foo'。它沒有什麼「錯誤」,但它不是我以前見過的模式,也不建議養成它的習慣。 –

+1

@Beerlington:你確定這個函數在第一個例子中使用了'Foo :: ClassMethods.foo'嗎?我剛剛測試過,它沒有(Ruby v2.0)。謝謝。 – sequielo