إنشاء واستئناف الـ coroutine
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 49 من 54.
الآن بعد أن فهمت ماهية الروتينات المساعدة (coroutines)، دعنا نتعلم كيفية إنشائها وتشغيلها فعلياً في Lua.
لإنشاء coroutine، تستخدم الدالة coroutine.create(). تأخذ هذه الدالة دالة عادية كمعامل لها وتغلفها في كائن coroutine. إليك الصيغة الأساسية:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)في هذه المرحلة، الكوروتين (coroutine) موجود ولكنه لم يبدأ في العمل بعد. لم يتم استدعاء الدالة myTask. لبدء تنفيذ الكوروتين فعلياً أو متابعته، تستخدم coroutine.resume():
coroutine.resume(co)عندما تستدعي resume() على الـ coroutine للمرة الأولى، فإنه يبدأ التنفيذ من بداية دالته. إذا استمر الـ coroutine في العمل حتى النهاية دون توقف مؤقت، فإنه يكتمل ولا يمكن استئنافه مرة أخرى.
إليك مثال كامل:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- يطبع كلتا الرسالتينيعمل الـ coroutine من البداية إلى النهاية دفعة واحدة. في الدرس القادم، ستتعلم كيفية جعل الـ coroutines تتوقف مؤقتًا في منتصف التنفيذ.
التحدي
سهلاكتب دالة runSimpleCoroutine تأخذ message وتعيد المخرجات من coroutine يقوم بطباعة تلك الرسالة.
قم بإنشاء coroutine باستخدام coroutine.create() يغلف دالة تقوم بطباعة الرسالة المقدمة. ثم استخدم coroutine.resume() لتنفيذ الـ coroutine. يجب أن تعيد الدالة الرسالة التي تمت طباعتها.
المنطق:
- قم بتعريف دالة تطبع معامل الرسالة
- قم بإنشاء coroutine من تلك الدالة باستخدام
coroutine.create() - قم باستئناف الـ coroutine باستخدام
coroutine.resume() - أعد الرسالة التي تمت طباعتها
المعاملات:
message(string): الرسالة التي سيتم طباعتها بواسطة الـ coroutine
المخرجات: الرسالة التي تمت طباعتها بواسطة الـ coroutine (string)
ورقة مرجعية
لإنشاء coroutine، استخدم coroutine.create() مع دالة كوسيط لها:
function myTask()
print("Hello from coroutine!")
end
local co = coroutine.create(myTask)لبدء أو متابعة تنفيذ الـ coroutine، استخدم coroutine.resume():
coroutine.resume(co)مثال كامل:
function greet()
print("Starting...")
print("Finishing!")
end
local co = coroutine.create(greet)
coroutine.resume(co) -- يطبع كلتا الرسالتينعند استدعاء resume() للمرة الأولى، يبدأ الـ coroutine في التنفيذ من البداية. إذا استمر في العمل حتى الاكتمال دون توقف، فلا يمكن استئنافه مرة أخرى.
جرّب بنفسك
function runSimpleCoroutine(message)
-- اكتب الكود هنا
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مراجعة - مولد الأرقاممراجعة - رياضيات المتجهات