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

جمع الكائنات

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 26 من 70.

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

تحدد __add metamethod ما يحدث عند استخدام + operator بين كائنين. عندما يرى 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 مُعرَّفة باستخدام نقطة، وليس نقطتين. تستقبل كلا operands كوسيطين، وينبغي أن تُعيد كائنًا جديدًا بدلًا من تعديل أيٍّ من الكائنين الأصليين. وهذا يجعل العملية قابلة للتنبؤ وآمنة.

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 لجميع instances، فإنها تشترك جميعًا في هذا السلوك تلقائيًا.

challenge icon

التحدي

سهل

لننشئ فئة Vector تدعم الجمع باستخدام عامل التشغيل +. هذه هي خطوتك الأولى نحو التحميل الزائد لعوامل التشغيل، مما يجعل كائناتك تعمل بشكل طبيعي مع عوامل التشغيل المضمّنة في Lua.

ستنظّم التعليمات البرمجية عبر ملفين:

  • Vector.lua: عرّف فئة Vector مع مكوّني x وy. أدرج مُنشئ :new(x, y) ونفّذ metamethod __add بحيث يؤدي جمع متجهين إلى إنشاء متجه جديد بالمكوّنين combined. تذكّر أن __add يستخدم صيغة النقطة (وليس النقطتين) ويتلقى كلا operand كوسيطين.
  • 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).

تنسيق الإخراج المطلوب: [المحتوى المترجم هنا]

جرّب بنفسك

-- تتطلب وحدة 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: اطبع قيم x و y للمتجه الناتج في سطرين منفصلين
quiz iconاختبر نفسك

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

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

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