Menu
CoddyTech

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

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

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 אונליין