Ruby C 확장에서 Proc를 블록으로 어떻게 변환합니까?
-
12-09-2019 - |
문제
나는 Ruby C 확장에 Procs를 저장하고 있으며 각 Proc를 통과해야합니다. 문제는 instance_eval이 Procs가 아닌 블록 만 허용한다는 것입니다. 루비에서는 간단히 갈 수있는 문제가 아닙니다.
proc_list.each { |my_proc|
@receiver.instance_eval(&my_proc)
}
그러나 Ruby C API를 사용하여 이것에 대해 어떻게 해야할지 잘 모르겠습니다.
내가 이것을 어떻게 달성 할 수 있는지 아이디어가 있습니까?
해결책
PICKAXE에서 p. 871 (1.9 판)
VALUE rb_iterate( VALUE (*method)(), VALUE args, VALUE (*block)(), VALUE arg2 )
인수 args 및 블록 블록이있는 메소드를 호출합니다. ㅏ
yield
이 방법으로부터 수율에 대한 인수와 두 번째 인수 Arg2가 블록을 호출 할 것이다.
그러니 당신을 통과하십시오 Proc
객체 arg2
그리고 정의 a (*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