つるはしから、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);
}
このコードはテストしていませんが、この記事の警告と一致しています。