Menu
Coddy logo textTech

מהי סגירה (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() רצה לראשונה. הפונקציה הפנימית נושאת איתה את הסביבה שלה, וכך משמרת את המצב בין קריאות.

challenge icon

אתגר

קל

כתבו פונקציה createMultiplier שיוצרת פונקציית כפל עם גורם מסוים, ואז משתמשת בה מיד כדי להכפיל מספר נתון.

ההיגיון:

  • צרו פונקציה מקוננת בתוך createMultiplier שמקבלת פרמטר מספרי
  • הפונקציה המקוננת אמורה להכפיל את הפרמטר שלה בגורם factor מהפונקציה החיצונית
  • הפונקציה המקוננת תיצור סגירה שתזכור את הערך של factor
  • קראו לפונקציית הכפל עם הפרמטר number והחזירו את התוצאה

פרמטרים:

  • factor (מספר): ערך המכפיל
  • number (מספר): המספר שיש להכפיל

ערך מוחזר:

  • התוצאה של הכפלת number ב-factor (מספר)

נסו בעצמכם

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- השתמשו בפונקציה multiply למטה

end
quiz iconבחנו את עצמכם

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

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

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