الدرس 5 من 10
الثقوب في القوائم
- 13 دقيقة
- 5 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
table.remove بدل nil
الشرح
#t لا يعدّ العناصر، بل يبحث عن حدّ: موضع فيه قيمة وبعده nil. القائمة المتّصلة ليس لها إلا حدّ واحد هو عدد عناصرها. أمّا إن صار في وسطها nil فلها أكثر من حدّ، و# حرّ في أن يُرجع أيًّا منها.
لذلك لا تحذف من قائمة بـ inventory[2] = nil: قد يبقى #inventory على حاله، وتتوقّف ipairs عند الثقب فيختفي ما بعده من كل حلقة، بلا أي خطأ. احذف بـ table.remove(inventory, 2)، فهي تزيح ما بعده خطوة وتبقى القائمة متّصلة. وإن كانت الفراغات مقصودة، كخانات شريط الأدوات، فلا تسأل # عنها: احفظ الحجم بنفسك في حقل مثل size.
والفخّ في الحذف داخل حلقة تمشي من الأول: كل حذف يزيح العنصر التالي إلى الموضع الذي فحصته للتوّ فيفلت من الفحص. ولأن حدّ الحلقة حُسب مرّة واحدة في بدايتها، تصل إلى مواضع صارت فارغة فترمي خطأ. امشِ من الآخر: for i = #items, 1, -1.
المطلوب
أصلح removeBroken(items) لتحذف من القائمة نفسها، بـ table.remove، كل غرض قيمة durability فيه 0، واكتب emptySlots(bar) تعدّ الخانات الفارغة من 1 إلى bar.size.
معايير التصحيح
5 معايير- removeBroken تحذف المكسور
- ولا تترك ثقبًا في القائمة
- والمكسوران المتتاليان يُحذفان معًا
- emptySlots تعدّ الخانات الفارغة
- حتى لو كانت الخانة الأولى فارغة