我在 Ruby C 扩展中存储了一个过程数组,我需要遍历每个过程并对每个过程进行实例评估。问题是instance_eval只接受块,而不接受过程。这不是 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 )

使用参数 args 和 block block 调用方法。A 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);
}

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top