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

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

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

challenge icon

التحدي

سهل

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

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

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

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

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

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

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