חידוש והשהיה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-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.
אתגר
קלכתבו פונקציה createEchoCoroutine שמקבלת את initialMessage ומחזירה מחרוזת המציגה תקשורת דו־כיוונית בין הקוד הראשי לבין קורוטינה.
צרו קורוטינה שפולטת תחילה את initialMessage, ואז מקבלת תגובה בעת חידוש הריצה שלה, ולבסוף פולטת את התגובה בחזרה. הפונקציה צריכה להדגים העברת ערכים גם מתוך הקורוטינה וגם אליה.
לוגיקה:
- צרו פונקציה שפולטת את
initialMessageושומרת את הערך שמוחזר מאותה פליטה - לאחר קבלת הערך, פלטו אותו בחזרה
- עטפו את הפונקציה בקורוטינה באמצעות
coroutine.create() - חדשו את ריצת הקורוטינה בפעם הראשונה כדי לקבל את ההודעה הראשונית
- חדשו את ריצת הקורוטינה בפעם השנייה, והעבירו לה את
"Response" - לכדו את הערך שנפלט מחידוש הריצה השני
- החזירו מחרוזת בפורמט:
First: [first_yield]\nSecond: [second_yield]
פרמטרים:
initialMessage(מחרוזת): ההודעה שהקורוטינה תפלט תחילה
ערך מוחזר: מחרוזת המציגה את שני הערכים שנפלטו, מופרדים באמצעות שורה חדשה (מחרוזת). פורמט: First: Hello\nSecond: Response
נסו בעצמכם
function createEchoCoroutine(initialMessage)
-- כתבו כאן קוד
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאיםתרגלו בעצמכם: קומפיילר Lua אונליין