الدرس 7 من 10
صنف من جدول
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الدوال وself والنقطتان
الشرح
ليس في Lua كلمة class، بل الصنف جدول يحمل الدوال (methods). والسطر Player.__index = Player يجعل هذا الجدول صالحًا ليكون جدولًا وصفيًّا لكائناته، فكل لاعب جدول فيه بياناته وحدها، وما لا يجده فيه، أي الدوال، يبحث عنه في Player. أمّا Player.new فتنشئ الجدول وتربطه بالصنف هكذا: setmetatable({}, Player).
والنقطتان : اختصار لمُعامل (parameter) مخفيّ اسمه self، فكتابة function Player:heal(amount) تعني function Player.heal(self, amount)، وكتابة hero:heal(10) تعني hero.heal(hero, 10). وبهذا تخدم الدالة الواحدة كل اللاعبين، وتعرف عن طريق self أيّهم استدعاها.
وأشهر خطأ هنا أن تكتب hero.takeDamage(30) بنقطة واحدة، فلا يصل hero إلى الدالة، ويصير self هو 30 وamount هو nil، ثم يظهر الخطأ attempt to index a number value (local 'self') داخل الدالة، بعيدًا عن السطر الذي فيه الخطأ فعلًا.
المطلوب
اكتب Player.new(name, hp) لتحفظ name وhp، وmaxHp مساويًا لـ hp، واكتب الدالتين heal(amount) التي تزيد الصحّة دون أن تتجاوز maxHp، وisAlive() التي تُرجع true أو false، ثم أصلح استدعاء takeDamage في المثال.
الفحوص
6 فحوص- الدالة Player.new تنشئ لاعبًا بقيمه
- لكل لاعب hp خاصّ به
- كل لاعب يصل إلى دوال الصنف
- الدالة heal تزيد الصحّة ولا تتجاوز maxHp
- الدالة isAlive تفرّق بين الحيّ والميّت
- المثال يعمل ويطبع بيانات اللاعب