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

resume و yield

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

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

عندما تقوم باستدعاء coroutine.resume() مع تمرير وسائط إضافية بعد كائن الـ coroutine، يتم تمرير تلك الوسائط إلى الـ coroutine. وداخل الـ coroutine، تصبح هذه القيم هي قيم الـ return لاستدعاء 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 وترجع سلسلة نصية توضح الاتصال ثنائي الاتجاه بين الكود الرئيسي و coroutine.

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

المنطق:

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

المعاملات:

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

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

جرّب بنفسك

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

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

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