الـ 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.
يؤدي هذا إلى إنشاء آلية احتياطية حيث يمكن لجدول واحد توفير قيم افتراضية لجدول آخر. يحتفظ الجدول الأصلي بقيمه الخاصة، ولكن يتم البحث تلقائيًا عن أي مفاتيح مفقودة في الجدول الاحتياطي.
التحدي
سهلاكتب دالة 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج