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

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) التي تغير طريقة سلوك جداولك.

challenge icon

التحدي

سهل

اكتب دالة 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
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow