سؤال

أنا أعمل مع ما يجب أن يكون التكرار الأساسي إلى حد ما. أنا أفهم أنني أستطيع تحقيقه مع رمز روبي، لكنني أعمل بالفعل في تمديد C، لذلك أفضل الحفاظ على هذه الوظيفة في C مع بقية الرمز - خاصة لأن هذا يجب العمل (بطريقة أو بأخرى) دون إصدار.

المشكلة مع rb_block_call. هنا هو كيف تصفه Readme.ext rb_block_call:

giveacodicetagpre.

يدعو طريقة على Recv، مع اسم الطريقة المحددة بواسطة الرمز منتصف، توريد func ككتلة. سوف تحصل funct على القيمة من العائد كما الحجة الأولى، Data2 كما ثانيا، و argc / argv كما الحجج الثالثة / الرابعة.

لذلك، فإن فهمي (التحقق من خلال النظر في روبي الداخلي)، هو أن وظيفة الاستقبال يجب أن تبدو وكأنها:

giveacodicetagpre.

وهنا ضربنا مشكلتنا. في حالة استخدامي (التي سأتضمن أدناه)، يتم تمرير rb_yield_value و data2 كما هو متوقع؛ ARGC، من ناحية أخرى، يتم تعيين دائما إلى 1، Argv [0] هو rb_yield_value، argv [1] هو false، argv [2] هو rb_yield_value، argv [3] يلقي استثناء.

لا يهم ما أبعزه للأرجال والأرجف؛ يؤدي تمرير 0 و NULL إلى نفس الشيء، كما يفعل 1 وقيمة مجموعة إلى qtrue. كل شيء مع argc / argv لا يزال كما هو موضح.

هنا هو الرمز الذي أعمله مع:

giveacodicetagpre.

لا يبدو أن Luby Internals لا تحتوي على العديد من الأمثلة على RB_BLOCK_CALL مع Argc / Argv ... على الأكثر أو يومين، وأعتقد أنهم جميعا ببساطة تتابع القيم داخليا بدلا من استخدامها.

الأفكار؟

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

المحلول

أنا جديد جدا على تمديد روبي ج، لكنني أعتقد أن ارتباكك هو.

giveacodicetagpre.

argc / argv هنا الحجج التي تتصل بها.

في وظيفة C تسمى ككتلة:

giveacodicetagpre.

Argc / Argv هي حجج الكتلة.

مثال بسيط هو حقن

هنا هي ترجمة C: [1،2،3] .inject {| sum، e |Sum + E}

giveacodicetagpre.

أي مخرجات (مكالمة إلى rb_block_call_test):

giveacodicetagpre.

أعتقد أن Recess_Value هو دائما Argv [0]

إذا كنت ترغب في اجتياز المعلومات بين الكتلة والمتصل، ثم استخدم Data2

في مثالك، أفترض أن #.AEAG_BackTrace_Frame يجسد "Backtrace_Frame" واحد، لذلك هو السبب في أن Argc / Argv من الكتلة هو دائما 1 / the_backtrace_frame.أعتقد أن #_Backtrace_Frame يقبل أي عدد من الحجج لأنه لم يرفع أي خطأ عندما حاولت نقل بعض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top