ما هو الـ Metatable؟
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 16 من 54.
إن الـ metatable هو ببساطة جدول Lua عادي، ولكن له غرض خاص. عندما تقوم بربط metatable بجدول آخر (لنسمه الجدول "الرئيسي")، يمكنك تغيير كيفية تصرف هذا الجدول الرئيسي عند إجراء عمليات معينة عليه.
فكر في الأمر على هذا النحو: عادةً، إذا حاولت جمع جدولين معاً باستخدام عامل التشغيل +، فلن تعرف لغة Lua ما يجب فعله وستعطيك خطأً. ولكن باستخدام metatable، يمكنك تحديد ما يعنيه الجمع لجداولك. يمكنك جعلها تجمع القيم المتقابلة، أو تدمج محتوياتها، أو تفعل أي شيء آخر منطقي لبرنامجك.
تعمل جداول الميتا (Metatables) من خلال تعريف وظائف خاصة تسمى metamethods. تمتلك هذه الـ metamethods أسماءً محددة تبدأ بشرطتين سفليتين، مثل __add للجمع أو __index للبحث عن المفاتيح المفقودة. عندما تواجه لغة Lua عملية على جدول يحتوي على metatable، فإنها تتحقق مما إذا كان الـ metatable يحتوي على الـ metamethod المقابل وتستخدمه لتحديد ما يجب أن يحدث.
يفتح هذا المفهوم آفاقاً واسعة مثل إنشاء أنواع بيانات مخصصة بسلوكياتها الخاصة، وتطبيق أنماط البرمجة كائنية التوجه، وحماية الجداول من التعديلات غير المرغوب فيها، وغير ذلك الكثير. في الدروس القادمة، ستتعلم كيفية إرفاق الجداول الوصفية (metatables) بالجداول واستخدام الأساليب الوصفية (metamethods) لتخصيص سلوكها.
ورقة مرجعية
الـ metatable هو جدول Lua عادي يمكن إرفاقه بجدول آخر لتغيير سلوكه في عمليات معينة.
تستخدم الـ Metatables وظائف خاصة تسمى metamethods تبدأ أسماؤها بشرطتين سفليتين:
__add- يحدد سلوك الجمع__index- يحدد سلوك البحث عن المفاتيح المفقودة
عند إجراء عملية على جدول يحتوي على metatable، تتحقق Lua من الـ metamethod المقابل وتستخدمه لتحديد السلوك.
تتيح الـ Metatables:
- إنشاء أنواع بيانات مخصصة بسلوكيات محددة
- تنفيذ أنماط البرمجة كائنية التوجه (object-oriented)
- حماية الجداول من التعديلات غير المرغوب فيها
جرّب بنفسك
لا يتضمّن هذا الدرس تحدّيًا برمجيًا.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج