Menu
CoddyTech

חיבור אובייקטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 26 מתוך 70.

כבר ראית איך מטא־מתודות כמו __tostring ו־__eq מאפשרות לך להתאים אישית את התנהגותם של אובייקטים. עכשיו נרחיב זאת לפעולות חשבון, החל בחיבור.

מתודת המטא __add מגדירה מה קורה כשמשתמשים באופרטור + בין שני אובייקטים. כש-Lua נתקל ב-a + b, הוא מחפש את __add במטא־טבלה של אחד משני האופרנדים.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

שימו לב ש־__add מוגדרת באמצעות נקודה. Lua מעבירה את שני האופרנדים כארגומנטים רגילים, וצורת הנקודה מעניקה לשניהם שמות. גם נקודתיים יעבדו, מכיוון ש־function Vector:__add(other) זהה ל־function Vector.__add(self, other), אבל צורת הנקודה היא המקובלת. __add אמורה להחזיר אובייקט חדש במקום לשנות אחד מהאובייקטים המקוריים. כך הפעולה נשארת צפויה ובטוחה.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- פלט: 4  6

התובנה המרכזית היא ש־__add חייב להיות במטא־טבלה עצמה (כאן, Vector), ולא רק באובייקט. מכיוון שהגדרנו את Vector כמטא־טבלה של כל המופעים, כולם חולקים את ההתנהגות הזאת באופן אוטומטי.

challenge icon

אתגר

קל

בואו נבנה מחלקה בשם Vector שתומכת בחיבור באמצעות האופרטור +. זהו הצעד הראשון שלך בדרך להעמסת אופרטורים, שמאפשרת לאובייקטים שלך לפעול באופן טבעי עם האופרטורים המובנים של Lua.

תארגן את הקוד שלך בשני קבצים:

  • Vector.lua: הגדר את מחלקת Vector שלך עם הרכיבים x ו-y. כלול בנאי :new(x, y) וממש את מטאתוד __add, כך שחיבור של שני וקטורים ייצור וקטור חדש עם הרכיבים המשולבים. הגדר את __add באמצעות נקודה, כך ששני האופרנדים יתקבלו כארגומנטים בעלי שם.
  • main.lua: טען את מודול Vector שלך, צור מופעים של וקטורים והדגם שחיבור שלהם מפיק את התוצאה הנכונה.

תקבל ארבעה קלטים:

  1. רכיב ה-x של הווקטור הראשון
  2. רכיב ה-y של הווקטור הראשון
  3. רכיב ה-x של הווקטור השני
  4. רכיב ה-y של הווקטור השני

בקובץ הראשי שלך, צור שני וקטורים עם הרכיבים הנתונים, חבר אותם באמצעות האופרטור + והדפס את ערכי x ו-y של הווקטור שהתקבל, כל אחד בשורה נפרדת.

לדוגמה, אם הקלטים הם 3, 4, 1, 2, הפלט צריך להיות:

4
6

הווקטור הראשון (3, 4) ועוד הווקטור השני (1, 2) שווים לווקטור חדש (4, 6).

נסו בעצמכם

-- טען את המודול Vector
local Vector = require('Vector')

-- קרא את הקלט
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: צור שני מופעים של Vector באמצעות ערכי הקלט

-- TODO: חבר את שני הווקטורים באמצעות האופרטור +

-- TODO: הדפס את ערכי x ו-y של הווקטור שהתקבל בשורות נפרדות
quiz iconבחנו את עצמכם

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

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

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