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つのメソッドだけでクラスを取るgemに取り組んでいます。初期化すると(親クラスに隠されます)、このメソッドが別のクラスに渡されます。これはブロックで作成できますが、メソッドを使用すると少しきれいになります。

PS:あるクラスから別のクラスにメソッドをコピーするようなものです

PSS : または... メソッドを proc に変換する方法を教えてください。class_eval

4

2 に答える 2

14

メソッドを Proc のように呼び出せるものに変換するには、 を使用しますobj.method(:method_name)これにより、バインドされたMethod オブジェクトが得られます。このオブジェクトは、 called のときに で呼び出されobjます。同じクラスの別のオブジェクトで呼び出したい場合は、 を呼び出すことができますmethod.unbind.bind(different_obj)

それでも、あるクラスから別のクラスにメソッドを「コピー」することはできません。ユーザーが 3 つのブロックを渡すのではなく、3 つのメソッドを定義するクラスを渡すことを許可する場合は、そのクラス (またはそのインスタンス) への参照を内部に格納し、必要に応じてそのクラスでメソッドを呼び出すと、よりうまく機能する可能性があります。 . それが「委任」についてコメントした人の意味です。

または、ユーザーにモジュールを渡させて、独自のクラスincludeまたはextendモジュールを (必要に応じて) 作成することもできます。

于 2012-02-15T13:43:08.283 に答える