الدرس 5 من 10
الفراغات داخل القوائم
- 13 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الحذف بـ table.remove لا بـ nil
الشرح
لا يعدّ #t العناصر، بل يبحث عن حدّ (border)، وهو موضع فيه قيمة والموضع الذي بعده 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 تحذف الأغراض المكسورة
- الدالة removeBroken لا تترك فراغًا في القائمة
- الغرضان المكسوران المتتاليان يُحذفان معًا
- الدالة emptySlots تعدّ الخانات الفارغة
- حتى لو كانت الخانة الأولى فارغة