دمج الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة 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 بنقطة حسب الاصطلاح، ويتلقى كلا المعاملين كوسيطين. والفرق الأساسي عن الميتاميثودات الحسابية هو أنك تتعامل عادةً مع أنواع مختلطة: كائنك وسلسلة نصية.
التحدي
سهللنبنِ صنفًا باسم Title يمكنه الاندماج بسلاسة في تعبيرات السلاسل النصية باستخدام العامل ... يفيد ذلك عندما تريد دمج الكائنات مع السلاسل النصية بطريقة مقروءة وبديهية، مثل إضافة ألقاب تشريفية أو لواحق إلى لقب شخص.
ستوزّع الشيفرة على ملفين:
Title.lua: عرّف صنفكTitleبحقلtextيخزّن نص اللقب. أضف مُنشئًا:new(text)ونفّذ التحويل الفوقي__concat. ينبغي للتحويل الفوقي أن يعالج الحالتين: عندما تأتي سلسلة نصية قبل الكائن ("prefix" .. obj) وعندما تأتي سلسلة نصية بعده (obj .. "suffix"). ينبغي أن تدمج النتيجة السلسلة النصية مع نص اللقب بالشكل المناسب.main.lua: استدعِ وحدةTitle، وأنشئ مثيلًا للقب، ووضّح عملية الدمج من كلا الاتجاهين.
ستتلقى ثلاثة مُدخلات:
- نص اللقب (مثل
Engineer) - سلسلة نصية بادئة توضع قبل اللقب (مثل
Senior) - سلسلة نصية لاحقة توضع بعد اللقب (مثل
III)
في ملفك الرئيسي، أنشئ كائنًا من Title باستخدام النص المُعطى. ثم نفّذ عمليتي دمج واطبع نتيجة كل منهما في سطر منفصل:
- ادمج السلسلة النصية البادئة مع كائن اللقب
- ادمج كائن اللقب مع السلسلة النصية اللاحقة
على سبيل المثال، إذا كانت المُدخلات هي 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 واطبع النتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت