どのように私はRubyのC拡張子でブロックにPROCを変換するのですか?
-
12-09-2019 - |
質問
私は、RubyのC拡張にprocsの配列を格納していると私は通過し、instance_evalを各PROCする必要があります。問題は、instance_evalをがブロックだけではなく、procsのを受け入れることです。これは私が簡単に行くことができRubyで問題ではありません。
proc_list.each { |my_proc|
@receiver.instance_eval(&my_proc)
}
しかし、私は、Ruby C APIを使用して、このついて行くには方法がわからないと思います。
誰もが、私はこれを実現する方法を任意のアイデアを持っていますか?
解決
つるはしから、P。 871(1.9版)
VALUE rb_iterate( VALUE (*method)(), VALUE args, VALUE (*block)(), VALUE arg2 )
は、引数引数とブロックブロックでメソッドを呼び出します。それから
yield
この方法は、生成する所与の引数と第二とのブロックを起動します 引数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);
}
私はこのコードをテストしていませんが、それは<のhref = "http://banisterfiend.wordpress.com/2008/09/25/metaprogramming-in-the-ruby-c-apiに警告と一致します-part-1ブロック/#の注意事項」のrel = "nofollowをnoreferrer">この記事でます。
所属していません StackOverflow