Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التحقق من المساواة

جزء من قسم البرمجة كائنية التوجه في رحلة 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 (معرفات مختلفة)

يكون هذا النمط قيّمًا عندما تمثّل الكائنات كيانات من العالم الحقيقي ذات معرّفات فريدة: مثل مقارنة سجلات قواعد البيانات، أو كيانات الألعاب، أو أي كائنات تكون فيها الهوية أهم من موقع الذاكرة.

challenge icon

التحدي

سهل

لنبنِ فئة 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:

  1. رمز SKU للمنتج الأول
  2. اسم المنتج الأول
  3. رمز SKU للمنتج الثاني
  4. اسم المنتج الثاني
  5. رمز SKU للمنتج الثالث
  6. اسم المنتج الثالث

في ملف main الخاص بك، أنشئ ثلاثة منتجات باستخدام inputs المقدمة، ثم اطبع:

  1. معلومات كل منتج (ثلاثة أسطر)
  2. نتيجة مقارنة المنتج 1 بالمنتج 2
  3. نتيجة مقارنة المنتج 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت