Menu
CoddyTech

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

جزء من قسم المنطق وتسلسل التنفيذ في رحلة Lua على Coddy. الدرس 18 من 54.

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

عادةً، عندما تبحث عن مفتاح غير موجود في جدول، تُرجع Lua القيمة nil. لكن عندما يكون للجدول جدول بيانات وصفية يحتوي على حقل __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 في الجدول الفوقي. وبما أن __index يشير إلى جدول defaults، تبحث Lua فيه وتجد health = 100.

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

يمكن أن تكون __index أيضًا دالة. عندما يكون المفتاح مفقودًا، تستدعيها Lua مع الجدول والمفتاح، وتستخدم القيمة التي تُرجعها:

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- يُحتسب كل اسم غير موجود على أنه 0
    end
})

print(scores.alice)  -- الناتج: 12
print(scores.bob)    -- الناتج: 0

يقدّم الجدول قيمًا احتياطية ثابتة؛ أما الدالة فيمكنها حساب قيمة لأي مفتاح مفقود.

challenge icon

التحدي

سهل

اكتب دالة createCharacterWithDefaults تأخذ name وlevel وتُعيد جدول شخصية يتضمن قيمًا افتراضية للسمات.

أنشئ جدول شخصية بالاسم والمستوى المقدَّمين. استخدم جدولًا فوقيًا مع __index لتوفير قيم افتراضية لأي سمات مفقودة (health وmana وstrength).

المنطق:

  • أنشئ جدولًا للقيم الافتراضية بالمفاتيح: health = 100 وmana = 50 وstrength = 10
  • أنشئ جدول شخصية بالمفاتيح: name (الاسم المقدَّم) وlevel (المستوى المقدَّم)
  • أنشئ جدولًا فوقيًا يكون فيه __index مشيرًا إلى جدول القيم الافتراضية
  • أرفق الجدول الفوقي بجدول الشخصية باستخدام setmetatable()
  • أعِد جدول الشخصية

المعاملات:

  • name (سلسلة نصية): اسم الشخصية
  • level (رقم): مستوى الشخصية

القيمة المُعادة: جدول شخصية يتضمن الاسم والمستوى، مع إمكانية الوصول إلى السمات الافتراضية من خلال الجدول الفوقي (جدول)

جرّب بنفسك

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

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

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

تدرّب بنفسك: مترجم Lua عبر الإنترنت