Menu
Coddy logo textTech

חידוש והשהיה

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 51 מתוך 54.

בשיעור הקודם למדת איך קורוטינה יכולה להעביר ערכים בחזרה לקוד הראשי באמצעות coroutine.yield(). אבל תקשורת יכולה לזרום בשני הכיוונים. אפשר גם לשלוח ערכים לתוך קורוטינה כשמחדשים את פעולתה.

כשקוראים ל־coroutine.resume() עם ארגומנטים נוספים אחרי אובייקט הקורוטינה, הארגומנטים האלה מועברים אל הקורוטינה. בתוך הקורוטינה, הערכים האלה הופכים לערכי ההחזרה של הקריאה ל־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" לתוך הקורוטינה

כאשר הקורוטינה מתחדשת בפעם השנייה, המחרוזת "Hello" מועברת פנימה והופכת לערך ההחזרה של coroutine.yield(), שנשמר במשתנה value.

challenge icon

אתגר

קל

כתבו פונקציה createEchoCoroutine שמקבלת את initialMessage ומחזירה מחרוזת המציגה תקשורת דו־כיוונית בין הקוד הראשי לבין קורוטינה.

צרו קורוטינה שפולטת תחילה את initialMessage, ואז מקבלת תגובה בעת חידוש הריצה שלה, ולבסוף פולטת את התגובה בחזרה. הפונקציה צריכה להדגים העברת ערכים גם מתוך הקורוטינה וגם אליה.

לוגיקה:

  • צרו פונקציה שפולטת את initialMessage ושומרת את הערך שמוחזר מאותה פליטה
  • לאחר קבלת הערך, פלטו אותו בחזרה
  • עטפו את הפונקציה בקורוטינה באמצעות coroutine.create()
  • חדשו את ריצת הקורוטינה בפעם הראשונה כדי לקבל את ההודעה הראשונית
  • חדשו את ריצת הקורוטינה בפעם השנייה, והעבירו לה את "Response"
  • לכדו את הערך שנפלט מחידוש הריצה השני
  • החזירו מחרוזת בפורמט: First: [first_yield]\nSecond: [second_yield]

פרמטרים:

  • initialMessage (מחרוזת): ההודעה שהקורוטינה תפלט תחילה

ערך מוחזר: מחרוזת המציגה את שני הערכים שנפלטו, מופרדים באמצעות שורה חדשה (מחרוזת). פורמט: First: Hello\nSecond: Response

נסו בעצמכם

function createEchoCoroutine(initialMessage)
    -- כתבו כאן קוד
end
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Lua אונליין