Menu
Coddy logo textTech

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

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

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 באמצעות require
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 אונליין