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