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

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

جزء من قسم المنطق والتحكم في التدفق في رحلة 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 يشير إلى جدول الافتراضيات
  • اربط الجدول الفوقي بجدول الشخصية باستخدام setmetatable()
  • أعد جدول الشخصية

المعاملات:

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

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

جرّب بنفسك

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

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

جميع دروس المنطق والتحكم في التدفق