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

resume و yield

جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 51 من 54.

في الدرس السابق، تعلمت كيف يمكن للروتين المساعد (coroutine) تمرير القيم مرة أخرى إلى الكود الرئيسي باستخدام coroutine.yield(). ولكن يمكن أن يتدفق الاتصال في كلا الاتجاهين. يمكنك أيضاً إرسال قيم إلى داخل الروتين المساعد (coroutine) عند استئنافه.

عندما تستدعي coroutine.resume() مع وسائط إضافية بعد كائن الـ coroutine، يتم تمرير هذه الوسائط إلى الـ coroutine. داخل الـ coroutine، تصبح هذه القيم هي قيم الإرجاع لاستدعاء coroutine.yield() الذي أوقفه مؤقتاً.

إليك كيف يعمل ذلك:

function receiver()
    print("Coroutine started")
    local value = coroutine.yield()
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- يبدأ ويتوقف مؤقتاً عند yield
coroutine.resume(co, "Hello")  -- يمرر "Hello" إلى الـ coroutine

عندما يستأنف الـ coroutine العمل للمرة الثانية، يتم تمرير السلسلة النصية "Hello" وتصبح القيمة المرجعة لـ coroutine.yield()، والتي يتم تخزينها في المتغير value.

challenge icon

التحدي

سهل

اكتب دالة createEchoCoroutine تأخذ initialMessage وتعيد سلسلة نصية (string) توضح الاتصال ثنائي الاتجاه بين الكود الرئيسي والـ coroutine.

قم بإنشاء coroutine يقوم أولاً بعمل yield لـ initialMessage، ثم يستقبل استجابة عند استئنافه (resumed)، وفي النهاية يقوم بعمل yield لتلك الاستجابة مرة أخرى. يجب أن توضح الدالة تمرير القيم من وإلى الـ coroutine.

المنطق:

  • قم بإنشاء دالة تقوم بعمل yield لـ initialMessage وتخزن القيمة الراجعة من ذلك الـ yield
  • بعد استلام القيمة، قم بعمل yield لها مرة أخرى للخارج
  • قم بتغليف هذه الدالة في coroutine باستخدام coroutine.create()
  • قم باستئناف (Resume) الـ coroutine للمرة الأولى للحصول على الرسالة الأولية
  • قم باستئناف الـ coroutine للمرة الثانية، مع تمرير "Response"
  • قم بالتقاط القيمة الناتجة عن الـ yield من الاستئناف الثاني
  • أعد سلسلة نصية بالتنسيق التالي: First: [first_yield]\nSecond: [second_yield]

المعاملات:

  • initialMessage (string): الرسالة التي سيقوم الـ coroutine بعمل yield لها أولاً

المخرجات: سلسلة نصية (string) تعرض كلتا القيمتين الناتجتين عن الـ yield ويفصل بينهما سطر جديد. التنسيق: First: Hello\nSecond: Response

ورقة مرجعية

يمكنك إرسال قيم إلى الروتين المساعد (coroutine) عند استئنافه عن طريق تمرير وسائط إضافية إلى coroutine.resume(). تصبح هذه الوسائط هي القيم المرجعة لاستدعاء coroutine.yield() الذي أوقف الروتين المساعد مؤقتاً.

function receiver()
    local value = coroutine.yield()  -- يتوقف مؤقتاً وينتظر الإدخال
    print("Received: " .. value)
end

local co = coroutine.create(receiver)
coroutine.resume(co)           -- يبدأ الروتين المساعد، ويتوقف مؤقتاً عند yield
coroutine.resume(co, "Hello")  -- يمرر "Hello" إلى الروتين المساعد

عندما يُستأنف الروتين المساعد في المرة الثانية، يتم تمرير "Hello" وتصبح هي القيمة المرجعة لـ coroutine.yield()، والتي يتم تخزينها في المتغير value.

جرّب بنفسك

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

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

جميع دروس Logic & Flow