2012-02-15 11 views
4

実際に他のクラスに属するいくつかのメソッドで小さなクラスを書きたいので、既存のクラスであるメソッドを他のクラスに定義するにはどうすればいいですか?私はそれが私が理解していない魔法のメタプログラミングだと信じています。あるクラスから別のクラスにメソッドをコピーする

class Foo 
    def initialize 
    # with blocks, I would just pass block, but this is methods 
    # so this won't work 
    Bar.class_eval(perform) 
    Bar.class_eval(process) 
    Bar.class_eval(save) 
    end 

    def perform 
    1+1 
    end 

    def process 
    # some code 
    end 

    def save 
    # some code 
    end 
end 

class Bar; end 

foo = Foo.new 
foo.perform 
#=> 2 
Bar.test 
#=> 1 

なぜこれが必要ですか?私は丁度3つの方法でクラスを取る宝石に取り組んでいます。初期化(親クラスに隠されていない)では、このメソッドを別のクラスに渡します。私はブロックでこれを行うことができますが、方法では少しクリーナーです。

PS:PROCにメソッドを変換する方法を...または、私は変換するにはclass_eval

+1

多分委任を使用する必要がありますか? http://khelll.com/blog/ruby/delegation-in-ruby/ – Fivell

+0

モジュールを含めることはできませんか? –

+0

@Fivell、多分!今すぐ代表団を読む必要があります – fl00r

答えて

12

にそれを渡すことができます:それは別の

PSSへの一つのクラスからコピーする方法のようなものですProcのように呼び出すことのできるメソッドには、obj.method(:method_name)を使用します。それはあなたにを返します。callが編集されたobjで呼び出されるメソッドオブジェクトです。同じクラスの別のオブジェクトで呼び出す場合は、method.unbind.bind(different_obj)を呼び出すことができます。

それでも、あるクラスから別のクラスにメソッドを "コピー"することはできません。 3つのブロックを渡すのではなく、3つのメソッドを定義するクラスをユーザーが通過できるようにするには、そのクラス(またはそのインスタンス)への参照を内部的に格納し、必要に応じてそのメソッドを呼び出す。それは、「代表団」についてのコメントをした人のことです。

または、ユーザーがモジュールを通過させ、モジュールincludeまたはextendを(必要に応じて)モジュールにすることができます。

+0

ユーザーのクラスオブジェクトへの参照は実際には良いアイデアです – fl00r

+0

私は参照を使用すると信じています:)しかし、 Rubyのクラス間でメソッドをコピーする! – fl00r

+0

私はそこにいるとは思わないが、方法を見つけたら投稿してください。私はあまりにも知りたいです。 –

関連する問題