مقارنة الكائنات (<, >)
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 29 من 70.
بالإضافة إلى العمليات الحسابية والدمج، يمكنك أيضًا تعريف كيفية مقارنة الكائنات بعضها ببعض باستخدام metamethods للمقارنة. يتولى metamethod __lt معالجة operator "أصغر من" (<code><).
عندما تقيّم 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 تستنتج operator تلقائيًا من __lt. عندما تكتب a > b، تقيّم Lua ببساطة b < a بدلًا من ذلك. لذا فإن تعريف __lt فقط يمنحك اتجاهَي المقارنة مجانًا.
التحدي
سهللنبنِ Product class يمكن مقارنتها باستخدام عاملي <code>< و بناءً على السعر. وهذا مثالي لسيناريوهات مثل ترتيب العناصر في عربة تسوق أو العثور على الخيار الأرخص في قائمة.
ستنظّم التعليمات البرمجية في ملفين:
Product.lua: Define الـ Product class مع حقليnameوprice. ضمّن مُنشئ:new(name, price)ونفّذ metamethod__ltلمقارنة products حسب سعرها. تذكّر أن تعريف__ltيمنحك تلقائيًا عاملأيضًا: تتولى Lua ذلك نيابةً عنك!main.lua: Require وحدة Product، وأنشئ instances من products من inputs، ثم قارن بينها لتحديد أيها أكثر أو أقل تكلفة.
ستتلقى أربعة inputs:
- اسم product الأول
- سعر product الأول
- اسم product الثاني
- سعر product الثاني
في ملفك الرئيسي، أنشئ اثنين من products باستخدام الأسماء والأسعار المُعطاة. ثم أجرِ ثلاث مقارنات واطبع نتيجة كل منها في سطر منفصل:
- هل product الأول أقل من الثاني؟ (اطبع
trueأوfalse) - هل product الأول أكبر من الثاني؟ (اطبع
trueأوfalse) - اطبع اسم product الأرخص
على سبيل المثال، إذا كانت inputs هي Apple و2 وLaptop و999، فيجب أن يكون Output:
true
false
Appleإن Apple (السعر 2) أقل من Laptop (السعر 999)، لذا فإن المقارنة الأولى هي true. وليست Apple أكبر من Laptop، لذا فإن النتيجة الثانية هي false. وبما أن Apple تملك السعر الأقل، فستُطبع باعتبارها product الأرخص.
جرّب بنفسك
-- تتطلب وحدة 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 عبر الإنترنت