Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تنسيق النصوص

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

challenge icon

التحدي

سهل

لنبنِ Book class تعرف كيفية تقديم نفسها! عند طباعة كتاب مباشرةً، ستعرض Lua سلسلة منسقة بشكل جميل بدلًا من عنوان ذاكرة غامض: وكل ذلك بفضل metamethod __tostring.

ستنظم الكود الخاص بك عبر ملفين:

  • Book.lua: عرّف Book class باستخدام نمط prototype القياسي. يجب أن يخزن كل كتاب title وauthor. أدرج constructor ‏:new(title, author) ونفّذ metamethod __tostring بحيث تعرض طباعة الكتاب معلوماته بتنسيق سهل القراءة.
  • main.lua: استخدم Require لوحدة Book، وأنشئ instances للكتب، واطبعها مباشرةً لرؤية تنسيق السلسلة المخصص الخاص بك أثناء العمل.

يجب أن تعيد method ‏__tostring سلسلة بالتنسيق الدقيق التالي:

"[title]" by [author]

لاحظ أن العنوان محاط بعلامتي اقتباس مزدوجتين داخل سلسلة الإخراج.

ستتلقى أربع inputs:

  1. عنوان الكتاب الأول
  2. مؤلف الكتاب الأول
  3. عنوان الكتاب الثاني
  4. مؤلف الكتاب الثاني

في ملفك الرئيسي، أنشئ كتابين باستخدام 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))

quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت