الدرس 4 من 10
جداول داخل جداول
- 12 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الوصول الآمن إلى الحقول العميقة
الشرح
قد تكون قيمة الحقل جدولًا آخر، وبهذا تُبنى حالة اللاعب كلها، فـ hero.equipment.weapon.name هو اسم سلاحه، وhero.inventory.items هو قائمة أغراضه، ويكفيك متغيّر واحد يحمل اللاعب بكل ما فيه لتمرّره إلى أي دالة.
لكن بيانات اللاعبين ليست مكتملة دائمًا، فالفلاح ليس معه سلاح، واللاعب الجديد ليست معه حقيبة بعد، وعندها ترمي peasant.equipment.weapon الخطأ attempt to index a nil value (field 'equipment') ويتوقّف السكربت كله. وفي خادم لعبة يعني هذا أن سجلًّا ناقصًا واحدًا يكفي لإيقاف الحلقة التي تمرّ على كل اللاعبين.
وتحمي نفسك من هذا بسلسلة من and، لأن a and b تُرجع a إن كانت nil أو false دون أن تنظر في b، فتتوقّف player.equipment and player.equipment.weapon عند أول مستوى ناقص وتُرجع nil دون خطأ، ثم تضع or القيمة البديلة. أمّا عند الكتابة فأنشئ المستوى الناقص قبل أن تنزل إليه، هكذا: player.inventory = player.inventory or {}.
المطلوب
أصلح weaponName(player) لتُرجع اسم السلاح، أو "بلا سلاح" إن لم يكن له سلاح، واكتب الدالة itemCount(player) التي تُرجع عدد عناصر player.inventory.items، أو 0 إن لم توجد، والدالة addItem(player, item) التي تضيف الغرض إلى player.inventory.items وتنشئ ما ينقص من هذا المسار دون أن تمسح ما فيه.
الفحوص
6 فحوص- الدالة weaponName تقرأ اسم السلاح
- الدالة weaponName لا تتوقّف بخطأ حين ينقص مستوى
- الدالة itemCount تعدّ الأغراض
- الدالة itemCount تُرجع 0 حين لا توجد حقيبة
- الدالة addItem تنشئ المستويات الناقصة
- الدالة addItem لا تمسح ما كان موجودًا