문제

나는 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);
}

이 코드를 테스트하지는 않았지만 경고와 일치합니다. 이 기사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top