مقارنة الكائنات (<, >)
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 29 من 70.
بالإضافة إلى العمليات الحسابية والدمج، يمكنك أيضاً تحديد كيفية مقارنة الكائنات ببعضها البعض باستخدام metamethods المقارنة. تتعامل الـ metamethod المسماة __lt مع عامل المقارنة "أصغر من" (<code><).
عندما تقوم Lua بتقييم a < b، فإنها تبحث عن __lt في الـ metatable. يجب أن تعيد هذه الـ metamethod القيمة 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 يمكن مقارنتها باستخدام عاملي المقارنة <code>< و بناءً على السعر. هذا مثالي لسيناريوهات مثل فرز العناصر في عربة التسوق أو العثور على الخيار الأرخص في القائمة.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Product.lua: قم بتعريف فئة Product الخاصة بك مع حقولnameوprice. قم بتضمين منشئ:new(name, price)وقم بتنفيذ الطريقة الوصفية (metamethod)__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 لديه السعر الأقل، فسيتم طباعته كمنتج أرخص.
ورقة مرجعية
تتعامل الطريقة الوصفية (metamethod) __lt مع عامل المقارنة "أصغر من" (<code><) للكائنات المخصصة.
عندما تقوم Lua بتقييم a < b، فإنها تبحث عن __lt في الجدول الوصفي (metatable). يجب أن تعيد هذه الطريقة الوصفية القيمة 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) -- Output: true
print(laptop < apple) -- Output: falseتشتق Lua تلقائيًا العامل من __lt. عندما تكتب a > b، تقوم Lua بتقييم b < a بدلاً من ذلك. تعريف __lt فقط يمنحك كلا اتجاهي المقارنة.
جرّب بنفسك
-- استدعاء وحدة Product
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: طباعة اسم المنتج الأرخص
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال