Menu
CoddyTech

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

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