Menu
Coddy logo textTech

השהיה באמצעות 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
challenge icon

אתגר

קל

כתבו פונקציה 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
quiz iconבחנו את עצמכם

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

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

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