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

طرح الكائنات

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 27 من 70.

تماماً كما يتعامل __add مع العامل +، يحدد التابع __sub السلوك الخاص بالعامل -. النمط متطابق تماماً—حيث تقوم بتعريف دالة تستقبل معاملين وتُعيد كائناً جديداً.

local Color = {}
Color.__index = Color

function Color:new(r, g, b)
    local obj = {r = r, g = g, b = b}
    setmetatable(obj, Color)
    return obj
end

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

عند العمل مع ألوان RGB، يمكن أن تنتج عملية الطرح قيمًا سالبة. في التطبيقات الواقعية، قد ترغب في حصر النتائج ضمن نطاقات صالحة (0-255)، لكن هيكل الطريقة الوصفية (metamethod) الأساسي يظل كما هو.

local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim

print(result.r, result.g, result.b)  -- الناتج: 150  120  80

تذكر: قم بتعريف __sub باستخدام نقطة (وليس نقطتين رأسيتين) لأنه metamethod تستدعيه Lua مباشرة مع كلا المعاملين كوسطاء.

challenge icon

التحدي

سهل

لنقم ببناء فئة Color تدعم عملية الطرح باستخدام عامل التشغيل -. يتم تمثيل الألوان بقيم RGB، وطرح لون من آخر ينشئ لوناً جديداً بفرق كل مكون.

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

  • Color.lua: قم بتعريف فئة Color الخاصة بك مع المكونات r و g و b التي تمثل قيم الأحمر والأخضر والأزرق. قم بتضمين منشئ :new(r, g, b) وقم بتنفيذ الطريقة الوصفية (metamethod) __sub بحيث يؤدي طرح لونين إلى إنشاء لون جديد بالفروق بين المكونات. تذكر أن __sub يستخدم صيغة النقطة (dot syntax) ويستقبل كلا المعاملين كوسطاء.
  • main.lua: قم باستدعاء وحدة Color الخاصة بك، وإنشاء مثيلات ألوان من المدخلات المقدمة، وطرحها، وعرض قيم RGB الناتجة.

ستتلقى ستة مدخلات:

  1. مكون اللون الأحمر للون الأول
  2. مكون اللون الأخضر للون الأول
  3. مكون اللون الأزرق للون الأول
  4. مكون اللون الأحمر للون الثاني
  5. مكون اللون الأخضر للون الثاني
  6. مكون اللون الأزرق للون الثاني

في ملفك الرئيسي، قم بإنشاء لونين بقيم RGB المعطاة، واطرح اللون الثاني من الأول باستخدام عامل التشغيل -، واطبع قيم r و g و b للون الناتج في أسطر منفصلة.

على سبيل المثال، إذا كانت المدخلات هي 200، 150، 100، 50، 30، 20، يجب أن يكون الناتج:

150
120
80

اللون الأول (200, 150, 100) ناقص اللون الثاني (50, 30, 20) يساوي لوناً جديداً (150, 120, 80).

ورقة مرجعية

تحدد الطريقة الوصفية (metamethod) ‏__sub سلوك المعامل -. وهي تستقبل معاملين وتُرجع كائناً جديداً.

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

قم بتعريف __sub باستخدام النقطة (وليس النقطتين الرأسيتين) لأنها طريقة وصفية تستدعيها لغة Lua مباشرة مع تمرير كلا المعاملين كوسيطات.

local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim

print(result.r, result.g, result.b)  -- Output: 150  120  80

جرّب بنفسك

-- استدعاء وحدة Color
local Color = require('Color')

-- قراءة قيم المدخلات
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())

-- TODO: إنشاء مثيلين من Color باستخدام قيم RGB المعطاة

-- TODO: طرح اللون الثاني من اللون الأول باستخدام معامل -

-- TODO: طباعة قيم r و g و b للون الناتج في أسطر منفصلة
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming