-1

この例は少し工夫されていますが、テストからのものであるため、このように機能し、実際のライブラリでこれを使用する方法を理解するのに役立ちます。私は次のように定義されたラムダを持っています:

l = lambda { |v| process(v) }

これをオブジェクトに渡し、そのオブジェクトのコンテキストでprocを実行したいと思います。オブジェクトは次のようになります。

class LambdaRunner
  def process(v)
    puts v
  end
  def run(proc)
    # code to run proc in the context of the object
  end
end

私はinstance_evalを使用してprocを実行するソリューションに精通しています。

instance_eval(&proc)

しかし、procに値を渡す必要があるため、これは機能しません。私は実用的なソリューションのようなものを管理しましたが、それはハッキーでエラーが発生しやすいと感じています。

self.class.class_eval do
  define_method(:runner, &proc)
end
runner('hi from lambda runner')

他のすべての方法はundefined method process

4

1 に答える 1

1

instance_execのドキュメントを参照してください(これは 1.8.7 にバックポートされています)。proc が 1 つの引数を取ると仮定すると、|v|おそらくLambdaRunner.

  def run(proc)
    instance_exec(v_value, &proc)
  終わり

ちなみに、ないバージョンのRuby#instance_execでは基本的にハックするしか実装方法はありません。これは、バックポートされたメソッドを持たない古い Rubyに実装する方法でした。

于 2013-03-22T06:28:09.393 に答える