2013-09-08 10 views
13

この質問は、直接this oneに関係しています。しかし、私はそれを根本的な問題に分解しようとしましたが、もう1つの質問ボックスにさらに多くのテキストを入力したくありませんでした。したがって、ここに行く:クラスメソッドを追加する方法

モジュールClassMethodsを拡張し、Module#includeフックを介してクラスメソッドを含めることで、classmethodsを含めることができます。しかし、前置詞で同じことをすることはできますか?ここに私の例である:

Fooクラス:

class Foo 
    def self.bar 
    'Base Bar!' 
    end 
end 

クラスの拡張:

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    base.extend(ClassMethods) 
    end 
end 
# prepend the extension 
Foo.send(:prepend, Extensions) 

クラスFooE:

require './Foo' 

class FooE < Foo 
end 

とシンプルstartscript:

require 'pry' 
require './FooE' 
require './Extensions' 

puts FooE.bar 

スクリプトを開始すると、私は期待通りではなくBase Bar!のようにExtended Bar!を取得しません。適切に働くためには何を変える必要がありますか?

答えて

18

問題は、モジュールを付加しているにもかかわらず、ClassMethodsはまだでextend編を取得していることをあなたが望む結果を得るためにこれを行うことができますです。Extensions自身が先頭に追加することができどちらかという

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    class << base 
     prepend ClassMethods 
    end 
    end 
end 

は注意Fooに含まれています。重要な部分は、前もってClassMethodsです。

+0

非常に素晴らしいです!どうもありがとう。明らかに私は拡張が何であるか分からなかった。 – Nessuno

+0

すごく、ありがとう... – Fabio

24

簡単なバージョン:

module Extensions 
    def bar 
    'Extended Bar!' 
    end 
end 

Foo.singleton_class.prepend Extensions 
+1

ありがとう、とても簡単ですね。 – 244an

関連する問題