Menu
Coddy logo textTech

נקודה לעומת נקודתיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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, ולהשתמש בנקודה כשהיא לא זקוקה לכך.

challenge icon

אתגר

קל

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

הוסיפו לטבלה שתי פונקציות:

  1. player.setScore(self, value) - מוגדרת באמצעות תחביר נקודה ופרמטר self מפורש. מגדירה את self.score לערך הנתון.
  2. player:addBonus(amount) - מוגדרת באמצעות תחביר נקודתיים. מוסיפה את amount ל־self.score.

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

  1. ערך ניקוד התחלתי
  2. כמות בונוס להוספה

בצעו את השלבים הבאים:

  1. קראו ל־setScore באמצעות תחביר נקודה (העבירו את הטבלה כארגומנט הראשון) כדי להגדיר את הניקוד ההתחלתי
  2. קראו ל־addBonus באמצעות תחביר נקודתיים כדי להוסיף את הבונוס
  3. הדפיסו את הערך הסופי של 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)
quiz iconבחנו את עצמכם

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

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

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