השהיה באמצעות coroutine.yield()
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 50 מתוך 54.
coroutine.yield(). בזכותה קורוטינה יכולה להשהות את עצמה באמצע הביצוע ולהחזיר את השליטה לקוד שהמשיך אותה.כאשר קורוטינה קוראת ל־coroutine.yield(), היא מפסיקה לפעול מיד באותה נקודה בדיוק. בפעם הבאה שתפעיל את coroutine.resume() על אותה קורוטינה, היא תמשיך בדיוק אחרי הקריאה ל־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() מריצה את הקורוטינה עד שהיא מגיעה ל־yield(). הקורוטינה זוכרת בדיוק היכן היא נעצרה, כולל כל המשתנים המקומיים שלה ומצב הביצוע.אפשר גם להעביר ערכים בחזרה בעת השהיית הביצוע. כל הארגומנטים שמעבירים אל coroutine.yield() הופכים לערכי ההחזרה של coroutine.resume(). שים לב ש-coroutine.resume() תמיד מחזירה ערך בוליאני של status כערך הראשון (true אם הקורוטינה רצה ללא שגיאות, או 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אתגר
קלכתבו פונקציה createYieldingCoroutine שמקבלת את count ומחזירה מחרוזת המציגה את הפלט מקורוטינה שפולטת ערכים מספר פעמים.
צרו קורוטינה שפולטת את המחרוזת "Step X" בכל שלב מ-1 ועד count, ובסך הכול count שלבים. חדשו את הקורוטינה count פעמים כדי לאסוף את כל הערכים שנפלטו. החזירו את כל הערכים שנפלטו כשהם מחוברים באמצעות תווי ירידת שורה.
לוגיקה:
- צרו פונקציה שמשתמשת בלולאה כדי לפלוט את
"Step 1", את"Step 2"וכן הלאה, עדcount - לאחר כל הפליטות, הפונקציה אמורה להסתיים (ללא פליטה אחרונה של "Done")
- עטפו את הפונקציה הזו בקורוטינה באמצעות
coroutine.create() - חדשו את הקורוטינה
countפעמים ואספו כל ערך שנפלט - שרשרו את כל הערכים שנפלטו עם תווי ירידת שורה ביניהם
- החזירו את המחרוזת המשורשרת
פרמטרים:
count(מספר): מספר השלבים שיש לפלוט
ערך מוחזר: מחרוזת המכילה את כל הערכים שנפלטו, מופרדים באמצעות תווי ירידת שורה (מחרוזת). פורמט: Step 1\nStep 2\nStep 3
נסו בעצמכם
function createYieldingCoroutine(count)
-- כתבו כאן קוד
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאים3מושגים מתקדמים בפונקציות
החזרת ערכים מרוביםפונקציות עם מספר משתנה של ארגומנטים (...)פונקציות כערכים ממדרגה ראשונהפונקציות אנונימיותמהי סגירה (Closure)?סיכום – מטפל אירועים פשוט9קורוטינות למתחילים
מהי קורוטינה?יצירה וחידוש של קורוטינההשהיה באמצעות coroutine.yield()חידוש והשהיהבדיקת מצב הקורוטינהסיכום – מחולל מספריםסיכום – חישובי וקטוריםתרגלו בעצמכם: קומפיילר Lua אונליין