دمج الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة 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.
التحدي
سهللنَبْنِ فئة Title يمكنها الاندماج طبيعيًا في تعبيرات السلاسل النصية باستخدام العامل ... يفيد هذا عندما تريد دمج الكائنات مع السلاسل النصية بطريقة مقروءة وبديهية، مثل إضافة ألقاب الاحترام أو اللواحق إلى لقب person.
ستنظّم التعليمات البرمجية عبر ملفين:
Title.lua: عرّف فئة Title مع حقلtextيخزّن سلسلة اللقب. أدرج مُنشئًا:new(text)ونفّذ metamethod__concat. يجب أن يتعامل metamethod مع كلتا الحالتين: عندما تأتي سلسلة نصية قبل الكائن ("prefix" .. obj) وعندما تأتي سلسلة نصية بعده (obj .. "suffix"). ينبغي أن تدمج النتيجة السلسلة النصية معtextالخاص باللقب بالشكل المناسب.main.lua: اطلب وحدة Title، وأنشئ كائن لقب، ووضّح عملية الدمج من كلا الاتجاهين.
ستتلقى ثلاث قيم إدخال:
- نص اللقب (مثلًا، "Engineer")
- سلسلة بادئة توضع قبل اللقب (مثلًا، "Senior ")
- سلسلة لاحقة توضع بعد اللقب (مثلًا، " III")
في ملفك الرئيسي، أنشئ كائن Title باستخدام النص المُعطى. ثم نفّذ عمليتي دمج واطبع كل نتيجة في سطر منفصل:
- ادمج السلسلة البادئة مع كائن اللقب
- ادمج كائن اللقب مع السلسلة اللاحقة
على سبيل المثال، إذا كانت قيم الإدخال هي 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 واطبع النتيجة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت