التحقق من حالة الـ Coroutine
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 52 من 54.
بينما تعمل مع الكوروتين (coroutines)، ستحتاج غالباً إلى معرفة الحالة التي يمر بها الكوروتين. هل هو قيد التشغيل حالياً؟ هل هو متوقف مؤقتاً وينتظر استئنافه؟ هل انتهى من التنفيذ؟
توفر Lua دالة coroutine.status() للإجابة على هذه الأسئلة.
تأخذ الدالة coroutine.status() الكوروتين (coroutine) كمعامل لها وتعيد سلسلة نصية تصف حالته الحالية. هناك ثلاث حالات ممكنة:
| "suspended" | الكوروتين متوقف مؤقتاً عند yield() ويمكن استئنافه |
| "running" | الكوروتين قيد التنفيذ حالياً |
| "dead" | انتهى الكوروتين من التنفيذ ولا يمكن استئنافه مرة أخرى |
إليك كيفية استخدامه:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (متوقف مؤقتاً عند yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (منتهي)التحدي
سهلاكتب دالة checkCoroutineLifecycle تأخذ resumeCount وتعيد سلسلة نصية (string) توضح حالة الـ coroutine في نقاط مختلفة من دورة حياتها.
قم بإنشاء coroutine يقوم بعمل yield مرة واحدة، ثم يكتمل. تحقق من حالته وسجلها بعد الإنشاء، وبعد الاستئناف الأول (عندما يكون متوقفاً مؤقتاً عند yield)، وبعد عمليات الاستئناف اللاحقة بناءً على resumeCount.
المنطق:
- أنشئ دالة تقوم بعمل yield للسلسلة النصية
"paused"مرة واحدة، ثم تكتمل - قم بلف هذه الدالة في coroutine باستخدام
coroutine.create() - تحقق من الحالة مباشرة بعد الإنشاء باستخدام
coroutine.status() - استأنف الـ coroutine مرة واحدة وتحقق من حالته مرة أخرى
- استأنف الـ coroutine مرات إضافية بناءً على
resumeCount - 1(إجمالي عمليات الاستئناف = resumeCount) - تحقق من الحالة النهائية بعد جميع عمليات الاستئناف
- أعد سلسلة نصية تحتوي على الحالات الثلاث بالتنسيق التالي:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
المعاملات:
resumeCount(number): إجمالي عدد مرات استئناف الـ coroutine (الحد الأدنى 1)
المخرجات: سلسلة نصية توضح حالة الـ coroutine في ثلاث نقاط من دورة حياتها (string). التنسيق: initial: suspended\nafter first resume: suspended\nfinal: dead
ورقة مرجعية
تعيد الدالة coroutine.status() الحالة الحالية للـ coroutine كسلسلة نصية.
الحالات الممكنة:
"suspended"- الـ coroutine متوقف مؤقتاً عندyield()ويمكن استئنافه"running"- الـ coroutine قيد التنفيذ حالياً"dead"- انتهى الـ coroutine من التنفيذ ولا يمكن استئنافه
الاستخدام:
coroutine.status(coroutine_object)مثال:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "dead"جرّب بنفسك
function checkCoroutineLifecycle(resumeCount)
-- اكتب الكود هنا
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مراجعة - مولد الأرقاممراجعة - رياضيات المتجهات