מהי סגירה (Closure)?
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 14 מתוך 54.
למדת שאפשר לשמור פונקציות במשתנים, להעביר אותן כארגומנטים ולהחזיר אותן מפונקציות אחרות. עכשיו נחקור את אחת ההשלכות העוצמתיות ביותר של זה: סגירות.
סגירה מתרחשת כאשר פונקציה מקוננת "זוכרת" את המשתנים המקומיים מהפונקציה העוטפת שלה, גם לאחר שהפונקציה החיצונית סיימה לפעול. זה אולי נשמע מוזר בהתחלה: איך משתנה יכול עדיין להתקיים אחרי שהפונקציה שיצרה אותו סיימה לפעול?
הנה דוגמה פשוטה שמדגימה את הרעיון הזה:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- פלט: 1
print(counter()) -- פלט: 2
print(counter()) -- פלט: 3כאשר קוראים ל־createCounter(), נוצרת משתנה מקומי count ומוחזרת פונקציה אנונימית. בדרך כלל, היית מצפה ש־count ייעלם לאחר שהקריאה ל־createCounter() מסתיימת. אבל לפונקציה המוחזרת עדיין יש גישה אל count. היא ״לוכדת״ את המשתנה הזה.
בכל פעם שקוראים ל־counter(), היא ניגשת לאותו משתנה count ומשנה אותו, המשתנה שנוצר כשהפונקציה createCounter() רצה לראשונה. הפונקציה הפנימית נושאת איתה את הסביבה שלה, וכך משמרת את המצב בין קריאות.
אתגר
קלכתבו פונקציה createMultiplier שיוצרת פונקציית כפל עם גורם מסוים, ואז משתמשת בה מיד כדי להכפיל מספר נתון.
ההיגיון:
- צרו פונקציה מקוננת בתוך
createMultiplierשמקבלת פרמטר מספרי - הפונקציה המקוננת אמורה להכפיל את הפרמטר שלה בגורם
factorמהפונקציה החיצונית - הפונקציה המקוננת תיצור סגירה שתזכור את הערך של
factor - קראו לפונקציית הכפל עם הפרמטר
numberוהחזירו את התוצאה
פרמטרים:
factor(מספר): ערך המכפילnumber(מספר): המספר שיש להכפיל
ערך מוחזר:
- התוצאה של הכפלת
numberב-factor(מספר)
נסו בעצמכם
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- השתמשו בפונקציה multiply למטה
endהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1איטרציה מתקדמת בטבלאות
איטרציה באמצעות pairs()איטרציה באמצעות ipairs()pairs() לעומת ipairs()סיכום – גיליון דמות2פונקציות נוספות של ספריית הטבלאות
table.concat()בניית טבלה ו־unpack()table.sort()מיון מותאם אישית באמצעות פונקציותסיכום – לוח שיאים3מושגים מתקדמים בפונקציות
החזרת ערכים מרוביםפונקציות עם מספר משתנה של ארגומנטים (...)פונקציות כערכים ממדרגה ראשונהפונקציות אנונימיותמהי סגירה (Closure)?סיכום – מטפל אירועים פשוטתרגלו בעצמכם: קומפיילר Lua אונליין