مقارنة الكائنات (<, >)
جزء من قسم البرمجة كائنية التوجه في رحلة 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)ونفّذ دالة 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 أقل، فستتم طباعة اسمه باعتباره المنتج الأرخص.
جرّب بنفسك
-- استيراد وحدة 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: اطبع اسم المنتج الأرخص
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت