كيف يمكنني تحويل بروك إلى كتلة في تمديد روبي ج؟

StackOverflow https://stackoverflow.com/questions/1241341

  •  12-09-2019
  •  | 
  •  

سؤال

أنا أخصيص مجموعة من ProCs في ملحق روبي جيم وأحتاج إلى المرور وإثبات كل بروك. المشكلة هي أن مثليه_eval يقبل فقط الكتل، وليس procs. هذه ليست مشكلة في روبي حيث يمكنني ببساطة الذهاب:

proc_list.each { |my_proc|
    @receiver.instance_eval(&my_proc)
}

ومع ذلك، أنا غير متأكد من كيفية الذهاب حول هذا باستخدام API Ruby C.

هل لدى أي شخص أي أفكار كيف قد أنجز هذا؟

هل كانت مفيدة؟

المحلول

من pickaxe، ص. 871 (1.9 طبعة)

VALUE rb_iterate( VALUE (*method)(), VALUE args, VALUE (*block)(), VALUE arg2 )

استدعاء الأسلوب مع الوسيطة Args وحظر كتلة. أ 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