تنسيق النصوص
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 16 من 70.
عندما تطبع كائنًا مباشرةً، تعرض Lua شيئًا غير مفيد مثل table: 0x55a.... مجرد عنوان ذاكرة. يتيح لك metamethod __tostring تحديد السلسلة النصية التي تمثل كائنك بالضبط عند طباعته أو تحويله إلى نص.
في نمط class، تضيف __tostring باعتبارها function في جدول class الخاص بك. وبما أن class نفسها تعمل باعتبارها metatable للـ instances، فإن Lua تعثر على هذه function وتستخدمها تلقائيًا:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endالآن، عند طباعة instance من نوع Player، تستدعي Lua طريقة __tostring تلقائيًا:
local hero = Player:new("Luna", 5)
print(hero) -- الناتج: Player: Luna (Level 5)لاحظ أن __tostring تستخدم صيغة النقطتين وتتلقى self، مما يتيح لك الوصول إلى جميع بيانات instance. يجب أن تُرجع الدالة سلسلة نصية. يمكنك تنسيقها بأي طريقة منطقية لكائنك، مع دمج أي سمات في تمثيل قابل للقراءة.
التحدي
سهللنبنِ Book class تعرف كيفية تقديم نفسها! عند طباعة كتاب مباشرةً، ستعرض Lua سلسلة منسقة بشكل جميل بدلًا من عنوان ذاكرة غامض: وكل ذلك بفضل metamethod __tostring.
ستنظم الكود الخاص بك عبر ملفين:
Book.lua: عرّفBookclass باستخدام نمط prototype القياسي. يجب أن يخزن كل كتابtitleوauthor. أدرج constructor :new(title, author)ونفّذ metamethod__tostringبحيث تعرض طباعة الكتاب معلوماته بتنسيق سهل القراءة.main.lua: استخدم Require لوحدة Book، وأنشئ instances للكتب، واطبعها مباشرةً لرؤية تنسيق السلسلة المخصص الخاص بك أثناء العمل.
يجب أن تعيد method __tostring سلسلة بالتنسيق الدقيق التالي:
"[title]" by [author]لاحظ أن العنوان محاط بعلامتي اقتباس مزدوجتين داخل سلسلة الإخراج.
ستتلقى أربع inputs:
- عنوان الكتاب الأول
- مؤلف الكتاب الأول
- عنوان الكتاب الثاني
- مؤلف الكتاب الثاني
في ملفك الرئيسي، أنشئ كتابين باستخدام inputs المقدمة واطبع كل كتاب مباشرةً (وليس عن طريق استدعاء method، بل استخدم print(book) فقط). يجب أن يظهر كل كتاب في سطر خاص به.
على سبيل المثال، إذا كانت inputs هي The Hobbit وJ.R.R. Tolkien و1984 وGeorge Orwell، فيجب أن يكون الإخراج:
"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwellتذكّر أن __tostring يجب أن تعيد سلسلة، وبما أن جدول class الخاص بك يعمل بوصفه metatable للـ instances، فستعثر Lua تلقائيًا على function __tostring الخاصة بك وتستخدمها عند طباعة كتاب.
جرّب بنفسك
-- تحميل وحدة Book
local Book = require('Book')
-- قراءة المدخلات
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: أنشئ مثيلين من الكتاب باستخدام Book:new()
-- TODO: اطبع كل كتاب مباشرة (فقط استخدم print(book))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت