בדיקת מצב הקורוטינה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 52 מתוך 54.
כשעובדים עם קורוטינות, לעיתים קרובות צריך לדעת באיזה מצב נמצאת קורוטינה. האם היא פועלת כרגע? האם היא מושהית וממתינה לחידוש פעולתה? האם היא סיימה את הביצוע?
Lua מספקת את הפונקציה coroutine.status() כדי לענות על השאלות האלה.
הפונקציה coroutine.status() מקבלת קורוטינה כארגומנט ומחזירה מחרוזת המתארת את מצבה הנוכחי. יש שלושה מצבים אפשריים:
| "suspended" | הקורוטינה מושהית ב-yield() וניתן לחדש את פעולתה |
| "running" | הקורוטינה פועלת כרגע |
| "dead" | הקורוטינה סיימה את פעולתה ואי אפשר לחדש אותה |
כך משתמשים בזה:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (מושהה ב-yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (הסתיים)אתגר
קלכתבו פונקציה checkCoroutineLifecycle שמקבלת את resumeCount ומחזירה מחרוזת המציגה את הסטטוס של קורוטינה בנקודות שונות במחזור החיים שלה.
צרו קורוטינה שמבצעת yield פעם אחת ואז מסתיימת. בדקו ותעדו את הסטטוס שלה לאחר יצירתה, לאחר החידוש הראשון (כאשר היא מושהית ב-yield), ולאחר חידושים נוספים בהתאם ל-resumeCount.
לוגיקה:
- צרו פונקציה שמבצעת yield למחרוזת
"paused"פעם אחת ואז מסתיימת - עטפו את הפונקציה הזו בקורוטינה באמצעות
coroutine.create() - בדקו את הסטטוס מיד לאחר היצירה באמצעות
coroutine.status() - חדשו את הקורוטינה פעם אחת ובדקו שוב את הסטטוס שלה
- חדשו את הקורוטינה פעמים נוספות בהתאם ל-
resumeCount - 1(מספר החידושים הכולל = resumeCount) - בדקו את הסטטוס הסופי לאחר כל החידושים
- החזירו מחרוזת עם שלושת הסטטוסים בפורמט:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
פרמטרים:
resumeCount(מספר): מספר הפעמים הכולל לחדש את הקורוטינה (מינימום 1)
ערך מוחזר: מחרוזת המציגה את הסטטוס של הקורוטינה בשלוש נקודות במחזור החיים שלה (מחרוזת). פורמט: initial: suspended\nafter first resume: suspended\nfinal: dead
נסו בעצמכם
function checkCoroutineLifecycle(resumeCount)
-- כתבו כאן את הקוד
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאים3מושגים מתקדמים בפונקציות
החזרת ערכים מרוביםפונקציות עם מספר משתנה של ארגומנטים (...)פונקציות כערכים ממדרגה ראשונהפונקציות אנונימיותמהי סגירה (Closure)?סיכום – מטפל אירועים פשוט9קורוטינות למתחילים
מהי קורוטינה?יצירה וחידוש של קורוטינההשהיה באמצעות coroutine.yield()חידוש והשהיהבדיקת מצב הקורוטינהסיכום – מחולל מספריםסיכום – חישובי וקטוריםתרגלו בעצמכם: קומפיילר Lua אונליין