Menu
Coddy logo textTech

השוואת אובייקטים (<, >)

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

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

כש-Lua מעריכה את a < b, היא מחפשת את __lt במטא-טבלה. המתודה המטא הזו אמורה להחזיר true או false בהתאם ללוגיקת ההשוואה שלך.

local Item = {}
Item.__index = Item
function Item:new(name, price)
    local obj = {name = name, price = price}
    setmetatable(obj, Item)
    return obj
end
function Item.__lt(a, b)
    return a.price < b.price
end

לאחר שהגדרת את __lt, עכשיו אפשר להשוות פריטים ישירות:

local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop)   -- פלט: true
print(laptop < apple)   -- פלט: false

וזה החלק המתוחכם: Lua גוזרת אוטומטית את האופרטור > מתוך __lt. כשכותבים a > b, Lua פשוט מחשבת במקום זאת את b < a. לכן, הגדרה של __lt בלבד מספקת לך בחינם את שני כיווני ההשוואה.

challenge icon

אתגר

קל

בואו נבנה מחלקת Product שאפשר להשוות באמצעות האופרטורים < ו־> לפי המחיר. היא מתאימה במיוחד לתרחישים כמו מיון פריטים בעגלת קניות או מציאת האפשרות הזולה ביותר ברשימה.

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

  • Product.lua: הגדירו את מחלקת Product עם השדות name ו־price. כללו בנאי :new(name, price) וממשו את מטא־מתודה __lt כדי להשוות מוצרים לפי המחיר שלהם. זכרו שהגדרה של __lt מעניקה לכם אוטומטית גם את האופרטור >: Lua מטפלת בזה עבורכם!
  • main.lua: טענו את המודול Product, צרו מופעים של מוצרים מהקלטים והשוו ביניהם כדי לקבוע איזה מהם עולה יותר או פחות.

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

  1. שם המוצר הראשון
  2. מחיר המוצר הראשון
  3. שם המוצר השני
  4. מחיר המוצר השני

בקובץ הראשי, צרו שני מוצרים עם השמות והמחירים הנתונים. לאחר מכן בצעו שלוש השוואות והדפיסו את התוצאה של כל אחת בשורה נפרדת:

  1. האם המוצר הראשון זול יותר מהמוצר השני? (הדפיסו true או false)
  2. האם המוצר הראשון יקר יותר מהמוצר השני? (הדפיסו true או false)
  3. הדפיסו את שם המוצר הזול יותר

לדוגמה, אם הקלטים הם Apple, 2, Laptop ו־999, הפלט צריך להיות:

true
false
Apple

ה־Apple (במחיר 2) זול יותר מה־Laptop (במחיר 999), ולכן תוצאת ההשוואה הראשונה היא true. ה־Apple אינו יקר יותר מה־Laptop, ולכן התוצאה השנייה היא false. ומכיוון של־Apple יש מחיר נמוך יותר, הוא יודפס כמוצר הזול יותר.

נסו בעצמכם

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

-- קרא את הקלטים
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())

-- TODO: צור שני מופעים של Product באמצעות Product:new()

-- TODO: השווה בין המוצרים באמצעות האופרטור < והדפס true/false

-- TODO: השווה בין המוצרים באמצעות האופרטור > והדפס true/false

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

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

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

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