1

procの配列をRubyC拡張機能に格納しているので、各procを調べてinstance_evalする必要があります。問題は、instance_evalがブロックのみを受け入れ、procを受け入れないことです。これは、Rubyでは問題ではありません。

proc_list.each { |my_proc|
    @receiver.instance_eval(&my_proc)
}

ただし、RubyCAPIを使用してこれを実行する方法がわかりません。

誰かが私がこれを達成する方法について何かアイデアがありますか?

4

1 に答える 1

1

つるはしから、p。871 (1.9 版)

VALUE rb_iterate( VALUE (*method)(), VALUE args, VALUE (*block)(), VALUE arg2 )

引数 args とブロック block を指定してメソッドを呼び出します。そのメソッドの ayieldは、yield に指定された引数と 2 番目の引数 arg2 を使用してブロックを呼び出します。

したがって、Procオブジェクトを として渡し、渡された値をのメソッドに転送するだけarg2の関数を定義します。(*block)()Proc#call

何かのようなもの

for (i = 0; i < numProcs; i++)
{
  rb_iterate( forwarder, receiver, block, procs[i] );
}

/*...*/

VALUE forwarder(VALUE receiver)
{
  // the block passed to #instance_eval will be the same block passed to forwarder
  return rb_obj_instance_eval(0, NULL, receiver);
}
VALUE block(VALUE proc)
{
  return rb_funcall(proc, rb_intern("call"), 0);
}

このコードはテストしていませんが、この記事の警告と一致しています。

于 2009-08-07T03:08:23.020 に答える