我在 Ruby C 扩展中存储了一个 proc 数组,我需要遍历每个 proc 和 instance_eval。问题是 instance_eval 只接受块,而不接受 procs。这不是 Ruby 中的问题,我可以简单地去:
proc_list.each { |my_proc|
@receiver.instance_eval(&my_proc)
}
但是我不确定如何使用 Ruby C API 来解决这个问题。
有谁知道我如何做到这一点?
我在 Ruby C 扩展中存储了一个 proc 数组,我需要遍历每个 proc 和 instance_eval。问题是 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 )
使用参数 args 和块块调用方法。来自该方法的 A
yield
将使用给定的参数来调用块 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);
}
我没有测试过这段代码,但它与本文中的警告一致。