נקודה לעומת נקודתיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 4 מתוך 70.
עכשיו, כשאתה מכיר גם את תחביר הנקודה וגם את תחביר הנקודתיים, כך הם קשורים זה לזה, ומה משתבש כשהטבלה לא מועברת.
שתי הנקודתיים הן קיצור. הגדרת function game:addPoints(points) זהה להגדרת function game.addPoints(self, points), וקריאה ל־game:addPoints(10) זהה לקריאה ל־game.addPoints(game, 10). מתודה פועלת כל עוד הטבלה מועברת כארגומנט הראשון שלה.
כך קורה כשהטבלה אינה מועברת:
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, ו־self.score נכשל כי 10 הוא מספר, לא טבלה.
פונקציה שהוגדרה עם נקודה ועם self מפורש פועלת עם קריאה באמצעות נקודתיים, משום שנקודתיים מעבירים את הטבלה כארגומנט הראשון:
function game.reset(self)
self.score = 0
end
-- קריאה עם נקודתיים: game:reset() זהה ל־game.reset(game)
game:reset() -- self מקבל את game כראוי, ולכן זה עובדשתי ההגדרות יוצרות את אותה פונקציה, ולכן הבחירה היא עניין של מוסכמה: השתמש בנקודתיים כדי להגדיר ולקרוא לפונקציות שעובדות עם self, ובנקודה עבור פונקציות שלא משתמשות ב־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 אונליין