الدرس 6 من 10
القيم الافتراضية
- 12 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الدالة setmetatable والحقل __index
الشرح
يمكن أن تربط بأي جدول جدولًا وصفيًّا (metatable)، وهو جدول ثانٍ يخبر Lua بما تفعله في حالات خاصّة. وأشهر حقوله __index، فحين تقرأ مفتاحًا غير موجود في الجدول تبحث عنه Lua في __index قبل أن تُرجع 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 تعمل دون وسيط