נקודה לעומת נקודתיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 4 מתוך 70.
עכשיו, כשאתם מכירים גם את תחביר הנקודה וגם את תחביר הנקודתיים, חשוב להבין מתי להשתמש בכל אחד מהם ומה קורה כשמשלבים ביניהם באופן שגוי.
הכלל המרכזי פשוט: האופן שבו מגדירים פונקציה חייב להתאים לאופן שבו קוראים לה. אם מגדירים עם נקודתיים, קוראים לה עם נקודתיים. אם מגדירים עם נקודה ועם self מפורש, קוראים לה עם נקודה ומעבירים את הטבלה.
כך נראה מה שקורה כשלא מתאימים ביניהם:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- שגוי: קריאה באמצעות נקודה, אך לא הועברה טבלה
game.addPoints(10) -- שגיאה! self הוא כעת 10, ולא הטבלהכשאתה קורא ל־game.addPoints(10), Lua לא מעבירה את game באופן אוטומטי. הערך 10 הופך ל־self, מה שגורם להתנהגות בלתי צפויה או לשגיאות.
הכיוון ההפוך סלחני יותר:
function game.reset(self)
self.score = 0
end
-- קריאה באמצעות נקודתיים: game:reset() שקולה ל־game.reset(game)
game:reset() -- self מקבל את game כראוי, ולכן זה עובדאף שהמקרה המסוים הזה עשוי לעבוד, הוא יוצר בלבול ועלול לשבש פונקציות שמצפות לארגומנטים מסוימים. הגישה הבטוחה ביותר היא לשמור על עקביות: להשתמש בנקודתיים הן בהגדרה והן בקריאה כאשר הפונקציה זקוקה ל־self, ולהשתמש בנקודה כשהיא לא זקוקה לכך.
אתגר
קלצרו טבלה בשם player עם שדה score שמאותחל ל־0.
הוסיפו לטבלה שתי פונקציות:
player.setScore(self, value)- מוגדרת באמצעות תחביר נקודה ופרמטרselfמפורש. מגדירה אתself.scoreלערך הנתון.player:addBonus(amount)- מוגדרת באמצעות תחביר נקודתיים. מוסיפה אתamountל־self.score.
תקבלו שתי קלטים:
- ערך ניקוד התחלתי
- כמות בונוס להוספה
בצעו את השלבים הבאים:
- קראו ל־
setScoreבאמצעות תחביר נקודה (העבירו את הטבלה כארגומנט הראשון) כדי להגדיר את הניקוד ההתחלתי - קראו ל־
addBonusבאמצעות תחביר נקודתיים כדי להוסיף את הבונוס - הדפיסו את הערך הסופי של
player.score
זכרו: צורת הקריאה לכל פונקציה צריכה להתאים לצורה שבה היא הוגדרה.
נסו בעצמכם
-- קרא את הקלט
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: כתבו את הקוד שלכם למטה
-- 1. צרו טבלה בשם 'player' עם שדה 'score' שמאותחל ל-0
-- 2. הוסיפו את player.setScore(self, value) באמצעות תחביר נקודה עם self מפורש
-- 3. הוסיפו את player:addBonus(amount) באמצעות תחביר נקודתיים
-- 4. קראו ל-setScore באמצעות תחביר נקודה (תוך העברת הטבלה כארגומנט הראשון)
-- 5. קראו ל-addBonus באמצעות תחביר נקודתיים
-- הדפיסו את הניקוד הסופי
print(player.score)השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין