resume و yield
جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy — الدرس 51 من 54.
في الدرس السابق، تعلمت كيف يمكن للـ coroutine أن يمرر قيمًا عودةً إلى الكود الرئيسي باستخدام coroutine.yield(). ولكن يمكن للتواصل أن يستمر في كلا الاتجاهين. يمكنك أيضًا إرسال قيم into الـ coroutine عندما تقوم بـ resume له.
عندما تقوم باستدعاء coroutine.resume() مع تمرير وسائط إضافية بعد كائن الـ coroutine، يتم تمرير تلك الوسائط إلى الـ coroutine. وداخل الـ coroutine، تصبح هذه القيم هي قيم الـ return لاستدعاء coroutine.yield() الذي أوقفها مؤقتًا.
إليك كيفية عمل ذلك:
function receiver()
print("Coroutine started")
local value = coroutine.yield()
print("Received: " .. value)
end
local co = coroutine.create(receiver)
coroutine.resume(co) -- يبدأ ويتوقف عند yield
coroutine.resume(co, "Hello") -- يمرر "Hello" إلى الـ coroutineعند استئناف الـ coroutine للمرة الثانية، يتم تمرير السلسلة النصية "Hello" وتصبح قيمة إرجاع coroutine.yield()، والتي يتم تخزينها في المتغير value.
التحدي
سهلاكتب دالة createEchoCoroutine تأخذ initialMessage وترجع سلسلة نصية توضح الاتصال ثنائي الاتجاه بين الكود الرئيسي و coroutine.
قم بإنشاء coroutine يقوم أولاً بإنتاج (yield) الـ initialMessage، ثم يستقبل استجابة عند استئنافه (resume)، وأخيراً يقوم بإنتاج تلك الاستجابة مرة أخرى. يجب أن توضح الدالة تمرير القيم إلى خارج وداخل الـ coroutine.
المنطق:
- أنشئ دالة تقوم بإنتاج
initialMessageوتخزين القيمة المرجعة من عملية الـyieldتلك - بعد استقبال القيمة، قم بإنتاجها مرة أخرى للخارج
- غلف هذه الدالة داخل
coroutineباستخدامcoroutine.create() - استأنف الـ
coroutineللمرة الأولى للحصول على الرسالة الأولية - استأنف الـ
coroutineللمرة الثانية، مع تمرير"Response" - التقط القيمة المُنتاجة من عملية الـ
resumeالثانية - أرجع سلسلة نصية بالتنسيق التالي:
First: [first_yield]\nSecond: [second_yield]
المعاملات:
initialMessage(string): الرسالة التي سيقوم الـcoroutineبإنتاجها أولاً
المخرجات: سلسلة نصية تُظهر كلا القيمتين المُنتاجتين مفصولتين بسطر جديد (string). التنسيق: First: Hello\nSecond: Response
جرّب بنفسك
function createEchoCoroutine(initialMessage)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج