Menu
Coddy logo textTech

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

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

בדומה לכך ש־__add מטפלת באופרטור +, מתודת המטא __sub מגדירה התנהגות עבור האופרטור -. התבנית זהה. מגדירים פונקציה שמקבלת שני אופרנדים ומחזירה אובייקט חדש.

local Color = {}
Color.__index = Color

function Color:new(r, g, b)
    local obj = {r = r, g = g, b = b}
    setmetatable(obj, Color)
    return obj
end

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

בעבודה עם צבעי RGB, חיסור יכול להפיק ערכים שליליים. ביישומים אמיתיים, ייתכן שתרצו להגביל את התוצאות לטווחים תקינים (0-255), אבל המבנה הבסיסי של מתודות מטא נשאר זהה.

local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim

print(result.r, result.g, result.b)  -- פלט: 150  120  80

זכרו: הגדירו את __sub עם נקודה (ולא עם נקודתיים), מכיוון שזו מתודת מטא ש-Lua קוראת לה ישירות עם שני האופרנדים כארגומנטים.

challenge icon

אתגר

קל

בואו נבנה מחלקה Color שתומכת בחיסור באמצעות האופרטור -. צבעים מיוצגים על ידי ערכי RGB, וחיסור של צבע אחד מצבע אחר יוצר צבע חדש, שבו כל רכיב הוא ההפרש בין הרכיבים המתאימים.

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

  • Color.lua: הגדירו את המחלקה Color עם הרכיבים r, g ו-b, המייצגים את ערכי האדום, הירוק והכחול. כללו בנאי :new(r, g, b) וממשו את המתודה המטא-טבלאית __sub, כך שחיסור של שני צבעים ייצור צבע חדש עם ההפרשים בין הרכיבים המתאימים. זכרו ש-__sub משתמשת בתחביר נקודה ומקבלת את שני האופרנדים כארגומנטים.
  • main.lua: טענו את המודול Color, צרו מופעי צבע מתוך הקלטים שסופקו, החסירו ביניהם והציגו את ערכי ה-RGB של התוצאה.

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

  1. רכיב האדום של הצבע הראשון
  2. רכיב הירוק של הצבע הראשון
  3. רכיב הכחול של הצבע הראשון
  4. רכיב האדום של הצבע השני
  5. רכיב הירוק של הצבע השני
  6. רכיב הכחול של הצבע השני

בקובץ הראשי, צרו שני צבעים עם ערכי ה-RGB הנתונים, החסירו את הצבע השני מהראשון באמצעות האופרטור -, והדפיסו את ערכי r, g ו-b של הצבע שהתקבל, כל אחד בשורה נפרדת.

לדוגמה, אם הקלטים הם 200, 150, 100, 50, 30, 20, הפלט צריך להיות:

150
120
80

הצבע הראשון (200, 150, 100) פחות הצבע השני (50, 30, 20) שווה לצבע חדש (150, 120, 80).

נסו בעצמכם

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

-- קרא את ערכי הקלט
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())

-- TODO: צור שני מופעים של Color עם ערכי ה-RGB הנתונים

-- TODO: החסר את הצבע השני מהראשון באמצעות האופרטור -

-- TODO: הדפס את ערכי r, g ו-b של הצבע שהתקבל, כל אחד בשורה נפרדת
quiz iconבחנו את עצמכם

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

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

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