どのように私はRubyのC拡張子でブロックにPROCを変換するのですか?

StackOverflow https://stackoverflow.com/questions/1241341

  •  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">この記事でます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top