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

الإيقاف المؤقت باستخدام 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
challenge icon

التحدي

سهل

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

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

جميع دروس Logic & Flow