1

我在 Ruby C 扩展中存储了一个 proc 数组,我需要遍历每个 proc 和 instance_eval。问题是 instance_eval 只接受块,而不接受 procs。这不是 Ruby 中的问题,我可以简单地去:

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

但是我不确定如何使用 Ruby C API 来解决这个问题。

有谁知道我如何做到这一点?

4

1 回答 1

1

从镐,p。871(1.9版)

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

使用参数 args 和块块调用方法。来自该方法的 Ayield将使用给定的参数来调用块 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);
}

我没有测试过这段代码,但它与本文中的警告一致。

于 2009-08-07T03:08:23.020 回答