تنسيق النصوص
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 16 من 70.
عندما تقوم بطباعة كائن مباشرةً، تعرض Lua شيئاً غير مفيد مثل table: 0x55a...—مجرد عنوان في الذاكرة. تسمح لك الطريقة الوصفية (metamethod) __tostring بتحديد السلسلة النصية التي تمثل كائنك بدقة عند طباعته أو تحويله إلى نص.
في نمط الفئة، تقوم بإضافة __tostring كدالة في جدول الفئة الخاص بك. وبما أن الفئة نفسها تعمل كـ metatable للمثيلات، فإن Lua تعثر على هذه الدالة وتستخدمها تلقائيًا:
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الآن عندما تقوم بطباعة مثيل Player، تستدعي Lua دالة __tostring الخاصة بك تلقائياً:
local hero = Player:new("Luna", 5)
print(hero) -- المخرجات: Player: Luna (Level 5)لاحظ أن __tostring يستخدم صيغة النقطتين الرأسيتين ويستقبل self، مما يمنحك الوصول إلى جميع بيانات المثيل. يجب أن تعيد الدالة سلسلة نصية—يمكنك تنسيقها بأي طريقة منطقية لكائنك، ودمج أي سمات في تمثيل قابل للقراءة.
التحدي
سهللنقم ببناء فئة Book تعرف كيف تقدم نفسها! عندما تقوم بطباعة كتاب مباشرة، ستقوم Lua بعرض سلسلة نصية منسقة بشكل جيد بدلاً من عنوان ذاكرة غامض—وكل ذلك بفضل ميثود __tostring الوهمي (metamethod).
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Book.lua: قم بتعريف فئةBookالخاصة بك باستخدام نمط النموذج الأولي (prototype pattern) القياسي. يجب أن يخزن كل كتابtitleوauthor. قم بتضمين منشئ:new(title, author)وقم بتنفيذ ميثود__tostringالوهمي بحيث تؤدي طباعة الكتاب إلى عرض معلوماته بتنسيق قابل للقراءة.main.lua: قم باستدعاء وحدة Book الخاصة بك، وأنشئ مثيلات للكتاب، وقم بطباعتها مباشرة لرؤية تنسيق السلسلة النصية المخصص الخاص بك قيد التشغيل.
يجب أن يعيد ميثود __tostring الخاص بك سلسلة نصية بهذا التنسيق الدقيق:
"[title]" by [author]لاحظ أن العنوان محاط بعلامات اقتباس مزدوجة داخل سلسلة المخرجات.
ستتلقى أربعة مدخلات:
- عنوان الكتاب الأول
- مؤلف الكتاب الأول
- عنوان الكتاب الثاني
- مؤلف الكتاب الثاني
في ملفك الرئيسي، أنشئ كتابين باستخدام المدخلات المقدمة واطبع كل كتاب مباشرة (ليس عن طريق استدعاء ميثود—فقط print(book)). يجب أن يظهر كل كتاب في سطر خاص به.
على سبيل المثال، إذا كانت المدخلات هي The Hobbit، و J.R.R. Tolkien، و 1984، و George Orwell، فيجب أن تكون المخرجات:
"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwellتذكر أن __tostring يجب أن يعيد سلسلة نصية، وبما أن جدول الفئة الخاص بك يعمل كجدول وهمي (metatable) للمثيلات، فإن Lua ستجد تلقائياً وتستخدم دالة __tostring الخاصة بك عندما تقوم بطباعة كتاب.
ورقة مرجعية
يحدد الأسلوب الخفي (metamethod) __tostring كيفية تمثيل الكائن كسلسلة نصية عند طباعته أو تحويله إلى نص.
بدون __tostring، تظهر طباعة الكائن عنوان ذاكرته فقط:
print(someObject) -- المخرجات: table: 0x55a...أضف __tostring كدالة (method) في فئتك (class) لتخصيص التمثيل النصي:
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)، تستدعي Lua تلقائياً __tostring:
local hero = Player:new("Luna", 5)
print(hero) -- المخرجات: Player: Luna (Level 5)نقاط رئيسية:
- استخدم صيغة النقطتين الرأسيتين (
:) لكي تستقبل الدالةself - يجب أن تعيد سلسلة نصية (string)
- الوصول إلى بيانات النسخة من خلال
self - بما أن جدول الفئة (class table) يعمل كجدول خفي (metatable)، تجد Lua الدالة
__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))
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال