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

تنسيق النصوص

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

challenge icon

التحدي

سهل

لنقم ببناء فئة Book تعرف كيف تقدم نفسها! عندما تقوم بطباعة كتاب مباشرة، ستقوم Lua بعرض سلسلة نصية منسقة بشكل جيد بدلاً من عنوان ذاكرة غامض—وكل ذلك بفضل ميثود __tostring الوهمي (metamethod).

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

  • Book.lua: قم بتعريف فئة Book الخاصة بك باستخدام نمط النموذج الأولي (prototype pattern) القياسي. يجب أن يخزن كل كتاب title و author. قم بتضمين منشئ :new(title, author) وقم بتنفيذ ميثود __tostring الوهمي بحيث تؤدي طباعة الكتاب إلى عرض معلوماته بتنسيق قابل للقراءة.
  • main.lua: قم باستدعاء وحدة Book الخاصة بك، وأنشئ مثيلات للكتاب، وقم بطباعتها مباشرة لرؤية تنسيق السلسلة النصية المخصص الخاص بك قيد التشغيل.

يجب أن يعيد ميثود __tostring الخاص بك سلسلة نصية بهذا التنسيق الدقيق:

"[title]" by [author]

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

ستتلقى أربعة مدخلات:

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

في ملفك الرئيسي، أنشئ كتابين باستخدام المدخلات المقدمة واطبع كل كتاب مباشرة (ليس عن طريق استدعاء ميثود—فقط 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))

quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming