التحقق من المساواة
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 17 من 70.
لقد رأيت كيف تتحكم __tostring في طريقة عرض الكائن لنفسه. ومن metamethod المفيدة الأخرى __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 (معرفات مختلفة)يكون هذا النمط قيّمًا عندما تمثّل الكائنات كيانات من العالم الحقيقي ذات معرّفات فريدة: مثل مقارنة سجلات قواعد البيانات، أو كيانات الألعاب، أو أي كائنات تكون فيها الهوية أهم من موقع الذاكرة.
التحدي
سهللنبنِ فئة Product يمكنها تحديد ما إذا كان منتجان هما العنصر نفسه، حتى عندما يكونان مخزنين في جدولين مختلفين تمامًا! في أنظمة البيع بالتجزئة، غالبًا ما تمتلك المنتجات رموز SKU فريدة (وحدات حفظ المخزون)، وينبغي اعتبار منتجين متساويين إذا اشتركا في رمز SKU نفسه، بغض النظر عن التفاصيل الأخرى مثل تغيّرات السعر.
ستنظّم الكود الخاص بك عبر ملفين:
Product.lua: عرّف فئةProductباستخدام نمط النموذج الأولي القياسي. يجب أن يخزّن كل منتج قيمةsku(المعرّف الفريد) وقيمةname. نفّذ دالة metamethod __eqبحيث يُعتبر منتجان متساويين عندما يكون لديهما رمز SKU نفسه: لا يهم الاسم عند تحديد التساوي.main.lua: استخدم require لوحدة Product وأنشئ عدة instances للمنتجات. قارن بينها باستخدام العامل==لرؤية منطق التساوي المخصص الخاص بك أثناء العمل.
يجب أن تتضمن فئة Product الخاصة بك ما يلي:
- دالة Constructor
:new(sku, name) - طريقة
:getInfo()تُرجع string بالتنسيق:[sku]: [name] - دالة metamethod
__eqالتي تقارن المنتجات حسب رمز SKU الخاص بها
ستتلقى ستة inputs:
- رمز SKU للمنتج الأول
- اسم المنتج الأول
- رمز SKU للمنتج الثاني
- اسم المنتج الثاني
- رمز SKU للمنتج الثالث
- اسم المنتج الثالث
في ملف main الخاص بك، أنشئ ثلاثة منتجات باستخدام inputs المقدمة، ثم اطبع:
- معلومات كل منتج (ثلاثة أسطر)
- نتيجة مقارنة المنتج 1 بالمنتج 2
- نتيجة مقارنة المنتج 1 بالمنتج 3
على سبيل المثال، إذا كانت inputs هي ABC123 وWireless Mouse وABC123 وMouse (Updated) وXYZ789 وKeyboard، فيجب أن يكون Output كما يلي:
ABC123: Wireless Mouse
ABC123: Mouse (Updated)
XYZ789: Keyboard
true
falseلاحظ أن أول منتجين متساويان (لديهما رمز SKU نفسه)، رغم اختلاف اسميهما. هذه هي بالضبط الطريقة التي تتعقب بها أنظمة المخزون الحقيقية المنتجات من خلال تغييرات الأسماء والتحديثات!
جرّب بنفسك
-- تتطلب وحدة Product
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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت