השוואת אובייקטים (<, >)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 בלבד מספקת לך בחינם את שני כיווני ההשוואה.
אתגר
קלבואו נבנה מחלקת Product שאפשר להשוות באמצעות האופרטורים < ו־> לפי המחיר. היא מתאימה במיוחד לתרחישים כמו מיון פריטים בעגלת קניות או מציאת האפשרות הזולה ביותר ברשימה.
תארגנו את הקוד שלכם בשני קבצים:
Product.lua: הגדירו את מחלקת Product עם השדותnameו־price. כללו בנאי:new(name, price)וממשו את מטא־מתודה__ltכדי להשוות מוצרים לפי המחיר שלהם. זכרו שהגדרה של__ltמעניקה לכם אוטומטית גם את האופרטור>: Lua מטפלת בזה עבורכם!main.lua: טענו את המודול Product, צרו מופעים של מוצרים מהקלטים והשוו ביניהם כדי לקבוע איזה מהם עולה יותר או פחות.
תקבלו ארבעה קלטים:
- שם המוצר הראשון
- מחיר המוצר הראשון
- שם המוצר השני
- מחיר המוצר השני
בקובץ הראשי, צרו שני מוצרים עם השמות והמחירים הנתונים. לאחר מכן בצעו שלוש השוואות והדפיסו את התוצאה של כל אחת בשורה נפרדת:
- האם המוצר הראשון זול יותר מהמוצר השני? (הדפיסו
trueאוfalse) - האם המוצר הראשון יקר יותר מהמוצר השני? (הדפיסו
trueאוfalse) - הדפיסו את שם המוצר הזול יותר
לדוגמה, אם הקלטים הם 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: הדפס את שם המוצר הזול יותר
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4פרויקט: בנק דיגיטלי
הגדרת הפרויקטפעולת הפקדה7פולימורפיזם ודריסת מתודות
דריסת מתודותקריאה למתודות של מחלקת האבטיפוסיות ברווזממשק משותףבדיקת טיפוססיכום – תפקידי עובדים2תבנית אב־טיפוס למחלקה
מושג אב־הטיפוסקישור באמצעות __indexהבנאי :new()אתחול מאפייניםמופעים עצמאייםסיכום – מפעל מכוניות5העמסת אופרטורים בתכנות מונחה עצמים
חיבור אובייקטיםחיסור אובייקטיםשרשור אובייקטיםהשוואת אובייקטים (<, >)חזרה – חישובים עם ארנק8כימוס
כללי מתן שמותClosures לשמירה על פרטיותגישה באמצעות Closuresטבלאות לקריאה בלבדלוגיקת אימותסיכום – כספת מאובטחת11תבניות עיצוב (בקצרה)
פונקציות Factoryטבלת Singletonתבנית IteratorObserver (מאזין)סיכום – מפעל Logger3מצב והתנהגות של אובייקטים
משתני מופעמתודות Getterמתודות Setterמאפיינים מחושביםעיצוב מחרוזותבדיקות שוויוןסיכום – ציון תלמיד6יסודות הירושה
הכנת מבנה הירושהירושת מתודותהרחבת הבנאיהוספת מתודות למחלקת הבתמשותף לעומת ייחודיסיכום – היררכיית צורותתרגלו בעצמכם: קומפיילר Lua אונליין