الدرس 6 من 10
القيم الافتراضية
- 12 دقيقة
- 5 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
setmetatable و __index
الشرح
لكل جدول أن يحمل جدولًا وصفيًّا (metatable): جدولًا ثانيًا يخبر Lua بما تفعله في مواقف خاصّة. أشهر حقوله __index: حين تقرأ مفتاحًا غير موجود، تبحث Lua فيه قبل أن تُرجع nil.
وهكذا تُصنع القيم الافتراضية: جدول defaults واحد، وكل عدوّ لا يحفظ إلا ما يختلف فيه. boss.hp من الزعيم نفسه، وboss.speed من defaults. ألف غول تتشارك جدولًا واحدًا بدل ألف نسخة، وتعديله يصل إليها كلها. أمّا الكتابة فلا تمرّ بـ __index: boss.speed = 8 تُكتب في الزعيم وحده.
والفخّ: setmetatable(boss, defaults). تبدو صحيحة ولا تعمل، لأن Lua لا تبحث في الجدول الوصفي نفسه بل في حقل __index منه. الصحيح setmetatable(boss, { __index = defaults }).
المطلوب
أصلح newEnemy(fields) لتُرجع fields، أو جدولًا جديدًا إن لم يُمرَّر، بجدول وصفي يأخذ الناقص من defaults دون أن ينسخ منه شيئًا.
معايير التصحيح
5 معايير- العدوّ الجديد يأخذ القيم الافتراضية
- وما يحدّده يغلب الافتراضي
- تعديل defaults يصل إلى الأعداء الموجودين
- الكتابة في عدوّ لا تمسّ غيره
- newEnemy بلا وسيط تعمل