'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אמנם העברת הטבלה באופן ידני עובדת, אבל היא עלולה להרגיש חזרתית. בשיעור הבא תלמדו תחביר נקי יותר שמטפל בכך באופן אוטומטי.
אתגר
קלצרו טבלה בשם tracker עם שדה count שמאותחל ל־0.
הוסיפו פונקציה tracker.addAmount(self, amount) ש:
- מקבלת את
self(הטבלה) כפרמטר הראשון - מקבלת את
amountכפרמטר השני - מוסיפה את
amountל־self.count
תקבלו שתי קלטים:
- הכמות הראשונה להוספה
- הכמות השנייה להוספה
קראו ל־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)השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין