Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التحقق من حالة الـ 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" (منتهي)
challenge icon

التحدي

سهل

اكتب دالة 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow