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

الـ Metamethod المسماة __index

جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 18 من 54.

الآن بعد أن عرفت كيفية إرفاق الجداول الوصفية (metatables) بالجداول، حان الوقت للتعرف على أهم طريقة وصفية (metamethod): __index. تتحكم هذه الطريقة الوصفية فيما يحدث عندما تحاول الوصول إلى مفتاح غير موجود في جدول ما.

عادةً، عندما تبحث عن مفتاح غير موجود في جدول، تُرجع Lua القيمة nil. ولكن عندما يحتوي الجدول على جدول وصفي (metatable) به حقل __index، ستقوم Lua بالتحقق من ذلك الحقل بدلاً من ذلك. إذا كان __index يشير إلى جدول آخر، فستبحث Lua عن المفتاح هناك:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- الناتج: Alice
print(player.health)  -- الناتج: 100

في هذا المثال، player لديه مفتاح name فقط. عندما تصل إلى player.health، لا يجدها Lua في player، لذا فإنه يتحقق من حقل __index الخاص بجدول الميتا (metatable). بما أن __index يشير إلى جدول defaults، يبحث Lua هناك ويجد health = 100.

يؤدي هذا إلى إنشاء آلية احتياطية حيث يمكن لجدول واحد توفير قيم افتراضية لجدول آخر. يحتفظ الجدول الأصلي بقيمه الخاصة، ولكن يتم البحث تلقائيًا عن أي مفاتيح مفقودة في الجدول الاحتياطي.

challenge icon

التحدي

سهل

اكتب دالة createCharacterWithDefaults تأخذ name و level وتعيد جدول شخصية (character table) مع قيم إحصائيات افتراضية.

قم بإنشاء جدول شخصية بالاسم والمستوى المقدمين. استخدم جدولاً وظيفياً (metatable) مع __index لتوفير قيم افتراضية لأي إحصائيات مفقودة (health، mana، strength).

المنطق:

  • قم بإنشاء جدول افتراضيات (defaults table) بالمفاتيح التالية: health = 100، mana = 50، strength = 10
  • قم بإنشاء جدول شخصية بالمفاتيح: name (الاسم المقدم) و level (المستوى المقدم)
  • قم بإنشاء metatable مع __index يشير إلى جدول الافتراضيات
  • اربط الـ metatable بجدول الشخصية باستخدام setmetatable()
  • أعد جدول الشخصية

المعاملات (Parameters):

  • name (string): اسم الشخصية
  • level (number): مستوى الشخصية

المخرجات: جدول شخصية يحتوي على name و level، مع إمكانية الوصول إلى الإحصائيات الافتراضية من خلال الـ metatable (table)

ورقة مرجعية

تتحكم الطريقة الوصفية (metamethod) المسماة __index فيما يحدث عندما تحاول الوصول إلى مفتاح غير موجود في جدول.

عندما يحتوي جدول على جدول وصفي (metatable) مع حقل __index يشير إلى جدول آخر، ستبحث لغة Lua عن المفاتيح المفقودة في ذلك الجدول:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- المخرجات: Alice
print(player.health)  -- المخرجات: 100

يؤدي هذا إلى إنشاء آلية احتياطية (fallback mechanism) حيث يمكن لجدول واحد توفير قيم افتراضية لجدول آخر. يحتفظ الجدول الأصلي بقيمه الخاصة، ولكن يتم البحث تلقائيًا عن أي مفاتيح مفقودة في الجدول الاحتياطي.

جرّب بنفسك

function createCharacterWithDefaults(name, level)
    -- اكتب الكود هنا
end
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow