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

طرح الكائنات

جزء من قسم البرمجة كائنية التوجه في رحلة 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 باستخدام dot (وليس colon)، لأنه metamethod تستدعيه Lua مباشرةً مع both operands بوصفهما arguments.

challenge icon

التحدي

سهل

لنبنِ فئة Color تدعم الطرح باستخدام - operator. تُمثَّل الألوان بقيم RGB، ويؤدي طرح لون من لون آخر إلى إنشاء لون جديد يحتوي على difference كل component.

ستنظّم شيفرتك عبر ملفين:

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

ستتلقى ستة inputs:

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

في ملف main الخاص بك، أنشئ لونين باستخدام قيم RGB given، واطرح اللون second من اللون first باستخدام - operator، ثم اطبع قيم r وg وb للون resulting في أسطر separate.

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

150
120
80

اللون first (200, 150, 100) مطروحًا منه اللون second (50, 30, 20) يساوي لونًا جديدًا (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اختبر نفسك

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

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

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