Menu
Coddy logo textTech

'self' מפורש

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 2 מתוך 70.

כשפונקציה נמצאת בתוך טבלה, לעיתים קרובות היא צריכה לגשת לנתונים שבתוך אותה טבלה או לשנות אותם. אבל הנה הבעיה: איך הפונקציה יודעת לאיזו טבלה היא שייכת?

הפתרון הוא להעביר את הטבלה במפורש כארגומנט הראשון לפונקציה. לפי המוסכמה, הפרמטר הזה נקרא self:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- פלט: 1

שימו לב שאנחנו קוראים ל־counter.increment(counter), ומעבירים את הטבלה עצמה כארגומנט. בתוך הפונקציה, self מתייחס עכשיו לטבלה הזאת, וכך מאפשר לנו לקרוא את self.value ולשנות אותו.

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

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- פלט: 1
print(counter.value)           -- פלט: 0

אמנם העברת הטבלה באופן ידני עובדת, אבל היא עלולה להרגיש חזרתית. בשיעור הבא תלמדו תחביר נקי יותר שמטפל בכך באופן אוטומטי.

challenge icon

אתגר

קל

צרו טבלה בשם tracker עם שדה count שמאותחל ל־0.

הוסיפו פונקציה tracker.addAmount(self, amount) ש:

  • מקבלת את self (הטבלה) כפרמטר הראשון
  • מקבלת את amount כפרמטר השני
  • מוסיפה את amount ל־self.count

תקבלו שתי קלטים:

  1. הכמות הראשונה להוספה
  2. הכמות השנייה להוספה

קראו ל־tracker.addAmount פעמיים (פעם אחת עבור כל קלט), והעבירו בכל פעם את הטבלה כארגומנט הראשון. לאחר שתי הקריאות, הדפיסו את הערך הסופי של tracker.count.

נסו בעצמכם

-- קראו את הקלט
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- TODO: כתבו את הקוד שלכם למטה
-- צרו טבלה בשם 'tracker' עם שדה 'count' שמאותחל ל-0
-- הוסיפו פונקציה tracker.addAmount(self, amount) שמוסיפה את amount ל-self.count
-- קראו ל-tracker.addAmount פעמיים, כשהטבלה היא הארגומנט הראשון


-- הציגו את הספירה הסופית
print(tracker.count)
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

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