Menu
Coddy logo textTech

בדיקות שוויון

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

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

כברירת מחדל, השוואה בין שתי טבלאות באמצעות == בודקת אם מדובר באותה טבלה בדיוק בזיכרון. שני אובייקטים נפרדים עם נתונים זהים יחזירו false:

local user1 = {id = 101, name = "Alice"}
local user2 = {id = 101, name = "Alice"}
print(user1 == user2)  -- פלט: false (טבלאות שונות)

באמצעות __eq, אפשר להגדיר לוגיקת שוויון משלך. במחלקה, מוסיפים אותה בדיוק כמו __tostring, כפונקציה בטבלת המחלקה. כדי שהשוויון יעבוד, שני האובייקטים חייבים לשתף את אותה מטא-טבלה:

local User = {}
User.__index = User

function User:new(id, name)
    local instance = {}
    setmetatable(instance, self)
    instance.id = id
    instance.name = name
    return instance
end

function User:__eq(other)
    return self.id == other.id
end

כעת שני אובייקטים מסוג User נחשבים שווים אם יש להם אותו מזהה, ללא קשר לשדות האחרים:

local u1 = User:new(101, "Alice")
local u2 = User:new(101, "Bob")
local u3 = User:new(202, "Alice")

print(u1 == u2)  -- פלט: true (אותו ID)
print(u1 == u3)  -- פלט: false (מזהי ID שונים)

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

challenge icon

אתגר

קל

בואו נבנה מחלקת Product שיכולה לקבוע אם שני מוצרים הם אותו פריט, גם כשהם מאוחסנים בטבלאות שונות לחלוטין! במערכות קמעונאיות, למוצרים יש לעיתים קרובות קודי SKU ייחודיים (יחידות שמירה במלאי), ויש להתייחס לשני מוצרים כשווים אם יש להם אותו SKU, בלי קשר לפרטים אחרים כמו שינויי מחיר.

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

  • Product.lua: הגדר את מחלקת Product באמצעות תבנית האב־טיפוס הסטנדרטית. כל מוצר צריך לשמור sku (המזהה הייחודי) ו-name. ממש את מטודת המטא __eq כך ששני מוצרים ייחשבו שווים כאשר יש להם אותו SKU: השם אינו משנה לצורך השוויון.
  • main.lua: טען את המודול Product וצור כמה מופעים של מוצרים. השווה ביניהם באמצעות האופרטור == כדי לראות את לוגיקת השוויון המותאמת שלך בפעולה.

מחלקת Product שלך צריכה לכלול:

  • בנאי :new(sku, name)
  • מתודה :getInfo() שמחזירה מחרוזת בפורמט: [sku]: [name]
  • מטודת המטא __eq שמשווה בין מוצרים לפי ה-SKU שלהם

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

  1. ה-SKU של המוצר הראשון
  2. השם של המוצר הראשון
  3. ה-SKU של המוצר השני
  4. השם של המוצר השני
  5. ה-SKU של המוצר השלישי
  6. השם של המוצר השלישי

בקובץ הראשי שלך, צור שלושה מוצרים באמצעות הקלטים שסופקו, ואז הדפס:

  1. המידע של כל מוצר (שלוש שורות)
  2. תוצאת ההשוואה בין מוצר 1 למוצר 2
  3. תוצאת ההשוואה בין מוצר 1 למוצר 3

לדוגמה, אם הקלטים הם ABC123, Wireless Mouse, ABC123, Mouse (Updated), XYZ789, ו-Keyboard, הפלט צריך להיות:

ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
false

שים לב ששני המוצרים הראשונים שווים (אותו SKU), אף על פי ששמותיהם שונים. כך בדיוק מערכות מלאי אמיתיות עוקבות אחר מוצרים גם לאחר שינויי שם ועדכונים!

נסו בעצמכם

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

-- קרא את הקלטים
local sku1 = io.read()
local name1 = io.read()
local sku2 = io.read()
local name2 = io.read()
local sku3 = io.read()
local name3 = io.read()

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

-- TODO: הדפס את המידע על כל מוצר (שלוש שורות)

-- TODO: הדפס את תוצאת ההשוואה בין מוצר 1 למוצר 2

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

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

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

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