الإيقاف المؤقت باستخدام coroutine.yield()
جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy — الدرس 50 من 54.
coroutine.yield(). هذا ما يسمح للدالة الروتينية المساعدة بـ `pauses` نفسها في منتصف التنفيذ وإعادة التحكم إلى الكود الذي قام بـ `resume` لها.عندما تستدعي الـ coroutine الدالة coroutine.yield()، فإنها تتوقف فورًا عن التشغيل عند تلك النقطة بالظبط. في المرة القادمة التي تستدعي فيها coroutine.resume() على الـ coroutine تلك، ستستأنف العمل من بعد استدعاء yield() مباشرةً، وكأن شيئًا لم يكن.إليك مثالاً بسيطاً:function countToThree()
print("One")
coroutine.yield()
print("Two")
coroutine.yield()
print("Three")
end
local co = coroutine.create(countToThree)
coroutine.resume(co) -- يطبع "One"، ثم يتوقف مؤقتًا
coroutine.resume(co) -- يطبع "Two"، ثم يتوقف مؤقتًا
coroutine.resume(co) -- يطبع "Three"، ثم ينتهيresume() الـ coroutine حتى تصل إلى yield(). تتذكر الـ coroutine بالضبط أين توقفت، بما في ذلك جميع المتغيرات الـ local وحالة التنفيذ الخاصة بها.يمكنك أيضًا تمرير قيم عند التوقف المؤقت (yielding). تصبح أي وسائط تعطيها لـ coroutine.yield() هي قيم الإرجاع لـ coroutine.resume(). لاحظ أن coroutine.resume() ترجع دائمًا قيمة منطقية لـ status كقيمة أولى (true إذا عمل الـ coroutine بدون أخطاء، أو false إذا حدث خطأ)، تليها أي قيم تم تمريرها إلى yield():function giveNumbers()
coroutine.yield(10)
coroutine.yield(20)
end
local co = coroutine.create(giveNumbers)
-- status هو true، value هو 10
local status, value = coroutine.resume(co)
print(value) -- يطبع: 10
-- status هو true، value هو 20
status, value = coroutine.resume(co)
print(value) -- يطبع: 20التحدي
سهلاكتب دالة createYieldingCoroutine تأخذ count وترجع سلسلة نصية توضح المخرجات من coroutine يقوم بتوليد القيم (yield) لعدة مرات.
أنشئ coroutine يقوم بتوليد السلسلة النصية "Step X" لكل خطوة من 1 إلى count، بإجمالي count من الخطوات. قم باستئناف (resume) الـ coroutine لـ count من المرات لجمع جميع القيم المولدة. أرجع جميع القيم المولدة مدمجة مع أسطر جديدة.
Logic:
- أنشئ دالة تستخدم حلقة لتوليد
"Step 1"،"Step 2"، إلخ، حتىcount - بعد كل عمليات التوليد، يجب أن تكتمل الدالة (لا يوجد yield أخير لـ "Done")
- غلف هذه الدالة داخل coroutine باستخدام
coroutine.create() - قم باستئناف الـ coroutine لـ
countمن المرات، مع تجميع كل قيمة مولدة - دمج جميع القيم المولدة مع إدراج أحرف سطر جديد بينها
- أرجع السلسلة النصية المدمجة
Parameters:
count(number): عدد الخطوات المراد توليدها
Returns: سلسلة نصية تحتوي على جميع القيم المولدة مفصولة بأسطر جديدة (string). الصيغة: Step 1\nStep 2\nStep 3
جرّب بنفسك
function createYieldingCoroutine(count)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق والتحكم في التدفق
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج3مفاهيم الدوال المتقدمة
إرجاع قيم متعددةالدوال متغيرة الوسائط (...)الدوال كقيم من الدرجة الأولىالدوال المجهولةما هو الـ Closure؟ملخص - معالج أحداث بسيط9Coroutines للمبتدئين
ما هو الـ Coroutine؟إنشاء واستئناف الـ coroutineالإيقاف المؤقت باستخدام coroutine.yield()resume و yieldالتحقق من حالة الـ Coroutineمراجعة - مولد الأرقاممراجعة - رياضيات المتجهات