الدرس 7 من 10
الإغلاق ومصانع الدوال
- 13 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
دوال تحتفظ بحالتها
الشرح
الدالة في Lua قيمة كالرقم والنصّ: تُسند إلى متغيّر، وتُمرَّر، وتُرجعها دالة أخرى. والدالة المعرَّفة داخل دالة ترى متغيّراتها المحلية، وتحتفظ بها بعد أن تنتهي الخارجية. هذا هو الإغلاق (closure).
ومنه نمط المصنع: makeCounter() تعرّف local count = 0 ثم تُرجع دالة تزيده. كل نداء للمصنع يصنع count جديدًا، فلكل عدّاد حالته، ولا يصل إليها أحد من الخارج. وبه تُبنى مؤقّتات القدرات: لكل قدرة وقت آخر استعمال خاصّ بها.
والخطأ الشائع أن تضع local count = 0 خارج المصنع، فتتشارك العدّادات كلها متغيّرًا واحدًا. وفي المؤقّت لا تسجّل الوقت إلا حين يُقبل الاستعمال، وإلا صارت كل محاولة مرفوضة تمدّد الانتظار.
المطلوب
اكتب makeCounter() تُرجع دالة تُرجع 1 ثم 2 ثم 3 مع كل نداء. وmakeCooldown(seconds) تُرجع دالة use(now): إن كان هذا أول استعمال أو مضت seconds على آخر استعمال مقبول سجّلت now وأرجعت true، وإلا أرجعت false. والوقت now يُمرَّر وسيطًا، وفي اللعبة يأتي من ساعة المحرّك.
معايير التصحيح
6 معايير- العدّاد يُرجع 1 ثم 2 ثم 3
- كل عدّاد مستقلّ بحالته
- الاستعمال الأول مسموح
- يُرفض قبل انقضاء المدّة ويُقبل عند تمامها
- المحاولة المرفوضة لا تعيد ضبط المؤقّت
- لكل قدرة مؤقّتها