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

مقارنة الكائنات (<, >)

جزء من قسم 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 فقط يمنحك كلا اتجاهي المقارنة مجانًا.

challenge icon

التحدي

سهل

لنقم ببناء فئة Product يمكن مقارنتها باستخدام عاملي المقارنة <code>< و بناءً على السعر. هذا مثالي لسيناريوهات مثل فرز العناصر في عربة التسوق أو العثور على الخيار الأرخص في القائمة.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Product.lua: قم بتعريف فئة Product الخاصة بك مع حقول name و price. قم بتضمين منشئ :new(name, price) وقم بتنفيذ الطريقة الوصفية (metamethod) __lt لمقارنة المنتجات حسب سعرها. تذكر أن تعريف __lt يمنحك تلقائيًا عامل التشغيل أيضًا — لغة Lua تتولى ذلك نيابة عنك!
  • main.lua: قم باستدعاء وحدة Product الخاصة بك، وإنشاء مثيلات للمنتجات من المدخلات، ومقارنتها لتحديد أيهما يكلف أكثر أو أقل.

ستتلقى أربعة مدخلات:

  1. اسم المنتج الأول
  2. سعر المنتج الأول
  3. اسم المنتج الثاني
  4. سعر المنتج الثاني

في ملفك الرئيسي، قم بإنشاء منتجين بالأسماء والأسعار المعطاة. ثم قم بإجراء ثلاث مقارنات واطبع نتيجة كل منها في سطر منفصل:

  1. هل المنتج الأول أقل من الثاني؟ (اطبع true أو false)
  2. هل المنتج الأول أكبر من الثاني؟ (اطبع true أو false)
  3. اطبع اسم المنتج الأرخص

على سبيل المثال، إذا كانت المدخلات هي 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: طباعة اسم المنتج الأرخص
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming