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

دمج الكائنات

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

يقوم العامل .. في Lua بدمج السلاسل النصية، ولكن ماذا لو أردت دمج كائن مع سلسلة نصية؟ تتيح لك طريقة metamethod ‏__concat تحديد كيفية عمل ذلك بالضبط.

عندما تواجه Lua التعبير a .. b ويحتوي أحد المعاملين على دالة metamethod باسم __concat، فإنها تستدعي تلك الدالة مع كلتا القيمتين. يكون هذا مفيدًا عندما تريد أن تندمج الكائنات بصورة طبيعية في تعبيرات السلاسل النصية.

local Name = {}
Name.__index = Name

function Name:new(first, last)
    local obj = {first = first, last = last}
    setmetatable(obj, Name)
    return obj
end

function Name.__concat(a, b)
    if type(a) == "string" then
        return a .. b.first .. " " .. b.last
    else
        return a.first .. " " .. a.last .. b
    end
end

لاحظ أن function تتحقق من أيّ operand هو string. وبما أن .. يمكن استخدامه على النحو "Hello " .. obj أو obj .. "!"، فينبغي أن تتعامل metamethod الخاصة بك مع both الحالات.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- المخرجات: Dr. Ada Lovelace
print(person .. " PhD")      -- المخرجات: Ada Lovelace PhD

مثل metamethod الأخرى الخاصة بالعوامل، تستخدم __concat صيغة النقطة وتتلقى both operand كوسيطين. والاختلاف الأساسي عن metamethod الحسابية هو أنك تتعامل عادةً مع أنواع مختلطة: object الخاص بك وstring.

challenge icon

التحدي

سهل

لنَبْنِ فئة Title يمكنها الاندماج طبيعيًا في تعبيرات السلاسل النصية باستخدام العامل ... يفيد هذا عندما تريد دمج الكائنات مع السلاسل النصية بطريقة مقروءة وبديهية، مثل إضافة ألقاب الاحترام أو اللواحق إلى لقب person.

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

  • Title.lua: عرّف فئة Title مع حقل text يخزّن سلسلة اللقب. أدرج مُنشئًا :new(text) ونفّذ metamethod‏ __concat. يجب أن يتعامل metamethod مع كلتا الحالتين: عندما تأتي سلسلة نصية قبل الكائن ("prefix" .. obj) وعندما تأتي سلسلة نصية بعده (obj .. "suffix"). ينبغي أن تدمج النتيجة السلسلة النصية مع text الخاص باللقب بالشكل المناسب.
  • main.lua: اطلب وحدة Title، وأنشئ كائن لقب، ووضّح عملية الدمج من كلا الاتجاهين.

ستتلقى ثلاث قيم إدخال:

  1. نص اللقب (مثلًا، "Engineer")
  2. سلسلة بادئة توضع قبل اللقب (مثلًا، "Senior ")
  3. سلسلة لاحقة توضع بعد اللقب (مثلًا، " III")

في ملفك الرئيسي، أنشئ كائن Title باستخدام النص المُعطى. ثم نفّذ عمليتي دمج واطبع كل نتيجة في سطر منفصل:

  1. ادمج السلسلة البادئة مع كائن اللقب
  2. ادمج كائن اللقب مع السلسلة اللاحقة

على سبيل المثال، إذا كانت قيم الإدخال هي Engineer وSenior و III، فينبغي أن يكون الناتج:

Senior Engineer
Engineer III

يوضح السطر الأول البادئة مدمجة مع اللقب، ويوضح السطر الثاني اللقب مدمجًا مع اللاحقة. يجعل metamethod‏ __concat هذا الدمج الطبيعي للسلاسل النصية ممكنًا!

جرّب بنفسك

-- اقرأ المدخلات
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

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

-- TODO: أنشئ كائن Title باستخدام titleText المعطى

-- TODO: ادمج prefix مع كائن العنوان واطبع النتيجة

-- TODO: ادمج كائن العنوان مع suffix واطبع النتيجة
quiz iconاختبر نفسك

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

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

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