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

الإيقاف المؤقت باستخدام coroutine.yield()

جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy — الدرس 50 من 54.

تكمن القوة الحقيقية للدوال الروتينية المساعدة (coroutines) في الدالة coroutine.yield(). هذا ما يسمح للدالة الروتينية المساعدة بـ `pauses` نفسها في منتصف التنفيذ وإعادة التحكم إلى الكود الذي قام بـ `resume` لها.عندما تستدعي الـ 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 بالضبط أين توقفت، بما في ذلك جميع المتغيرات الـ local وحالة التنفيذ الخاصة بها.يمكنك أيضًا تمرير قيم عند التوقف المؤقت (yielding). تصبح أي وسائط تعطيها لـ coroutine.yield() هي قيم الإرجاع لـ coroutine.resume(). لاحظ أن coroutine.resume() ترجع دائمًا قيمة منطقية لـ status كقيمة أولى (true إذا عمل الـ coroutine بدون أخطاء، أو false إذا حدث خطأ)، تليها أي قيم تم تمريرها إلى yield():
function giveNumbers()
    coroutine.yield(10)
    coroutine.yield(20)
end

local co = coroutine.create(giveNumbers)

-- status هو true، value هو 10
local status, value = coroutine.resume(co)
print(value)  -- يطبع: 10

-- status هو true، value هو 20
status, value = coroutine.resume(co)
print(value)  -- يطبع: 20
challenge icon

التحدي

سهل

اكتب دالة createYieldingCoroutine تأخذ count وترجع سلسلة نصية توضح المخرجات من coroutine يقوم بتوليد القيم (yield) لعدة مرات.

أنشئ coroutine يقوم بتوليد السلسلة النصية "Step X" لكل خطوة من 1 إلى count، بإجمالي count من الخطوات. قم باستئناف (resume) الـ coroutine لـ count من المرات لجمع جميع القيم المولدة. أرجع جميع القيم المولدة مدمجة مع أسطر جديدة.

Logic:

  • أنشئ دالة تستخدم حلقة لتوليد "Step 1"، "Step 2"، إلخ، حتى count
  • بعد كل عمليات التوليد، يجب أن تكتمل الدالة (لا يوجد yield أخير لـ "Done")
  • غلف هذه الدالة داخل coroutine باستخدام coroutine.create()
  • قم باستئناف الـ coroutine لـ count من المرات، مع تجميع كل قيمة مولدة
  • دمج جميع القيم المولدة مع إدراج أحرف سطر جديد بينها
  • أرجع السلسلة النصية المدمجة

Parameters:

  • count (number): عدد الخطوات المراد توليدها

Returns: سلسلة نصية تحتوي على جميع القيم المولدة مفصولة بأسطر جديدة (string). الصيغة: Step 1\nStep 2\nStep 3

جرّب بنفسك

function createYieldingCoroutine(count)
    -- اكتب الكود هنا
end
quiz iconاختبر نفسك

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

جميع دروس المنطق والتحكم في التدفق