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

جمع الكائنات

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

لقد رأيت بالفعل كيف تتيح لك الميثودات الوصفية (metamethods) مثل __tostring و __eq تخصيص كيفية تصرف الكائنات. الآن سنقوم بتوسيع هذا ليشمل العمليات الحسابية، بدءاً من الجمع.

تحدد الطريقة الوصفية (metamethod) __add ما يحدث عندما تستخدم المعامل + بين كائنين. عندما تصادف Lua التعبير a + b، فإنها تبحث عن __add في الجدول الوصفي (metatable) لأي من المعاملين.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

لاحظ أن __add يتم تعريفه بنقطة، وليس بنقطتين رأسيتين. فهو يستقبل كلا المعاملين كوسطاء (arguments) ويجب أن يعيد كائناً جديداً بدلاً من تعديل أي من الكائنين الأصليين. هذا يحافظ على العملية قابلة للتوقع وآمنة.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- الناتج: 4  6

الفكرة الأساسية هي أن __add يجب أن يكون في الـ metatable نفسه (هنا، Vector)، وليس فقط في الكائن. وبما أننا قمنا بتعيين Vector كـ metatable لجميع النسخ، فإنها جميعاً تشترك في هذا السلوك تلقائياً.

challenge icon

التحدي

سهل

لنقم ببناء فئة Vector تدعم عملية الجمع باستخدام عامل التشغيل +. هذه هي خطوتك الأولى في تحميل عامل التشغيل بشكل زائد (operator overloading) — مما يجعل كائناتك تعمل بشكل طبيعي مع عوامل التشغيل المدمجة في Lua.

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

  • Vector.lua: قم بتعريف فئة Vector الخاصة بك مع المكونين x و y. قم بتضمين منشئ :new(x, y) وقم بتنفيذ الطريقة الوصفية (metamethod) ‏__add بحيث يؤدي جمع متجهين إلى إنشاء متجه جديد بالمكونات المدمجة. تذكر أن __add يستخدم صيغة النقطة (وليس النقطتين الرأسيتين) ويستقبل كلا المعاملين كوسطاء.
  • main.lua: استدعِ وحدة Vector الخاصة بك، وأنشئ مثيلات للمتجهات، وأثبت أن جمعها يعطي النتيجة الصحيحة.

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

  1. مكون x للمتجه الأول
  2. مكون y للمتجه الأول
  3. مكون x للمتجه الثاني
  4. مكون y للمتجه الثاني

في ملفك الرئيسي، أنشئ متجهين بالمكونات المعطاة، واجمعهما معاً باستخدام عامل التشغيل +، واطبع قيم x و y للمتجه الناتج في أسطر منفصلة.

على سبيل المثال، إذا كانت المدخلات هي 3، 4، 1، 2، يجب أن يكون الناتج:

4
6

المتجه الأول (3, 4) زائد المتجه الثاني (1, 2) يساوي متجهاً جديداً (4, 6).

ورقة مرجعية

تحدد الطريقة الوصفية (metamethod) ‏__add ما يحدث عند استخدام عامل التشغيل + بين كائنين.

عندما ترى لغة Lua التعبير a + b، فإنها تبحث عن __add في الجدول الوصفي (metatable) لأي من المعاملين.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

يتم تعريف __add باستخدام نقطة، وليس نقطتين رأسيتين. وهي تستقبل كلا المعاملين كوسطاء (arguments) ويجب أن تعيد كائناً جديداً بدلاً من تعديل أي من الكائنين الأصليين.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Output: 4  6

يجب أن تكون __add موجودة في الجدول الوصفي (metatable) نفسه، وليس فقط في الكائن.

جرّب بنفسك

-- Vector استيراد وحدة
local Vector = require('Vector')

-- قراءة المدخلات
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: باستخدام قيم المدخلات Vector قم بإنشاء مثيلين من

-- TODO: + قم بجمع المتجهين باستخدام عامل الجمع

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

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

جميع دروس Object Oriented Programming