الـ Metamethod المسماة __tostring
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 20 من 54.
عندما تقوم بطباعة جدول (table) في لغة Lua، فإنك عادةً ما ترى شيئاً غير مفيد مثل table: 0x5f8a20—مجرد عنوان في الذاكرة. تسمح لك الميتا-دالة (metamethod) المسماة __tostring بتغيير هذا السلوك من خلال تحديد ما يجب عرضه بالضبط عند تحويل الجدول الخاص بك إلى سلسلة نصية (string).
تعد هذه الطريقة الوصفية (metamethod) مفيدة بشكل خاص لتصحيح الأخطاء وإنشاء مخرجات أكثر وضوحاً. عندما تحتاج لغة Lua إلى تحويل جدولك إلى سلسلة نصية (مثل عند استخدام print())، فإنها تتحقق مما إذا كان الجدول يحتوي على جدول وصفي (metatable) به حقل __tostring. إذا كان الأمر كذلك، تستدعي Lua تلك الدالة وتستخدم قيمتها المرجعة بدلاً من التمثيل الافتراضي.
إليك كيفية تنفيذ ذلك:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- النتيجة: Vector(3, 4)تستقبل الدالة __tostring الجدول كوسيط لها ويجب أن تعيد سلسلة نصية. في هذا المثال، تقوم ببناء سلسلة نصية منسقة تعرض قيم x و y للمتجه بتنسيق قابل للقراءة.
هذا يجعل التعامل مع الكود الخاص بك أسهل بكثير. فبدلاً من رؤية عناوين ذاكرة غامضة أثناء تصحيح الأخطاء (debugging)، ستحصل على معلومات ذات معنى حول ما يحتويه جدولك.
التحدي
سهلاكتب دالة createPoint تأخذ إحداثيات x و y وتعيد جدول نقطة مع تمثيل نصي مخصص.
قم بإنشاء جدول يحتوي على حقول x و y، وأرفق به جدولاً وصفياً (metatable) باستخدام ميثود __tostring، ثم أعد نتيجة تحويل الجدول إلى سلسلة نصية باستخدام tostring().
المنطق:
- إنشاء جدول بمفاتيح
xوyمضبوطة على الإحداثيات المقدمة - إنشاء جدول وصفي (metatable) باستخدام
__tostringيعيد سلسلة نصية بالتنسيق"Point(x, y)" - إرفاق الجدول الوصفي بجدول النقطة باستخدام
setmetatable() - إرجاع
tostring(point)للحصول على التمثيل النصي المخصص
المعاملات:
x(number): إحداثي x للنقطةy(number): إحداثي y للنقطة
المخرجات: التمثيل النصي المخصص للنقطة بالتنسيق "Point(x, y)" (string)
ورقة مرجعية
تسمح لك الميثود الوهمية (metamethod) المسماة __tostring بتخصيص كيفية عرض الجدول عند تحويله إلى سلسلة نصية. بشكل افتراضي، تؤدي طباعة جدول إلى إظهار عنوان في الذاكرة مثل table: 0x5f8a20.
عندما تقوم لغة Lua بتحويل جدول إلى سلسلة نصية (كما هو الحال مع print())، فإنها تتحقق مما إذا كان الجدول يحتوي على جدول وهمي (metatable) به حقل __tostring. إذا كان موجوداً، تستدعي Lua تلك الدالة وتستخدم القيمة المرجعة منها.
تستقبل دالة __tostring الجدول كوسيط لها ويجب أن تعيد سلسلة نصية:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- المخرج: Vector(3, 4)يمكنك أيضاً تحويل جدول صراحةً إلى سلسلة نصية باستخدام tostring()، والتي ستستدعي الميثود الوهمية __tostring إذا كانت محددة.
جرّب بنفسك
function createPoint(x, y)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية4مقدمة إلى Metatables
ما هو الـ Metatable؟setmetatable و getmetatableالـ Metamethod المسماة __indexالـ Metamethod المسماة __newindexالـ Metamethod المسماة __tostringالـ Metamethods الحسابية - الجزء الأولالـ Metamethods الحسابية - الجزء الثانيملخص - جدول للقراءة فقط2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج