Menu
CoddyTech

دمج الكائنات

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

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

عندما تواجه Lua التعبير a .. b ويكون لأحد المعاملين طريقة ميتا __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

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

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

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

مثل بقية الميتاميثودات الخاصة بالعوامل، يُكتب __concat بنقطة حسب الاصطلاح، ويتلقى كلا المعاملين كوسيطين. والفرق الأساسي عن الميتاميثودات الحسابية هو أنك تتعامل عادةً مع أنواع مختلطة: كائنك وسلسلة نصية.

challenge icon

التحدي

سهل

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

ستوزّع الشيفرة على ملفين:

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

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

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

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

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

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

Senior Engineer
Engineer III

يعرض السطر الأول دمج السلسلة البادئة مع اللقب، ويعرض السطر الثاني دمج اللقب مع السلسلة اللاحقة. يتيح لك التحويل الفوقي __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 عبر الإنترنت