如何将 Proc 转换为 Ruby C 扩展中的块?
-
12-09-2019 - |
题
我在 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);
}
我还没有测试过这段代码,但它与中的警告一致 本文.
不隶属于 StackOverflow