setmetatable و getmetatable
جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 17 من 54.
الآن بعد أن فهمت ماهية الجداول الوصفية (metatables) من الناحية المفاهيمية، حان الوقت لتعلم كيفية التعامل معها فعلياً. توفر Lua وظيفتين أساسيتين لهذا الغرض: setmetatable() لربط جدول وصفي بجدول، و getmetatable() لاستعادته.
لإرفاق جدول وصفي (metatable) بجدول، يمكنك استخدام setmetatable(). تأخذ هذه الدالة وسيطين: الجدول الذي تريد تعديله (الجدول الرئيسي) والجدول الوصفي الذي تريد إرفاقه به:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)في هذا المثال، أصبح myMetatable متصلاً الآن بـ myTable. الـ metatable نفسها فارغة في الوقت الحالي، ولكن هذا ينشئ الاتصال بين الجدولين. تعيد الدالة setmetatable() أيضاً الجدول الرئيسي، مما يسمح لك بتسلسل العملية إذا لزم الأمر.
لاسترداد الـ metatable المرفق بجدول، استخدم getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- المخرجات: trueتعيد هذه الدالة الجدول الوصفي (metatable) إذا كان هناك واحد مرفق، أو nil إذا لم يكن للجدول جدول وصفي. هذا مفيد عندما تحتاج إلى التحقق من أو تعديل الجدول الوصفي لجدول ما بعد تعيينه.
إن فهم هاتين الدالتين هو الأساس لكل عمل يتعلق بجداول الميتا (metatables) في لغة Lua. وبمجرد أن تتمكن من إرفاق واسترجاع جداول الميتا، ستكون مستعدًا لتعريف دوال الميتا (metamethods) التي تغير طريقة سلوك جداولك.
التحدي
سهلاكتب دالة attachMetatable تأخذ mainTable و metaTable وتعيد true إذا تم إرفاق الـ metatable بنجاح.
استخدم setmetatable() لإرفاق الـ metatable بالجدول الرئيسي، ثم تحقق من الإرفاق باستخدام getmetatable().
المنطق:
- أرفق
metaTableبـmainTableباستخدامsetmetatable() - استرجع الـ metatable المرفق باستخدام
getmetatable() - قارن الـ metatable المسترجع مع
metaTableالأصلي - أعد
trueإذا تطابقا، وfalseخلاف ذلك
المعاملات:
mainTable(table): الجدول الذي سيتم إرفاق الـ metatable بهmetaTable(table): الـ metatable المراد إرفاقه
المخرجات: true إذا تم إرفاق الـ metatable والتحقق منه بنجاح، و false خلاف ذلك (boolean)
ورقة مرجعية
توفر لغة Lua وظيفتين أساسيتين للتعامل مع الجداول الوصفية (metatables):
setmetatable() - يربط جدولاً وصفياً (metatable) بجدول معين. يأخذ وسيطين: الجدول الرئيسي والجدول الوصفي المراد ربطه. ويعيد الجدول الرئيسي.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - يسترجع الجدول الوصفي المرتبط بجدول ما. يعيد الجدول الوصفي إذا كان هناك واحد مرتبط، أو nil إذا لم يكن للجدول جدول وصفي.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- النتيجة: trueجرّب بنفسك
function attachMetatable(mainTable, metaTable)
-- اكتب الكود هنا
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج