الدرس 7 من 10

الإغلاق ومصانع الدوال

هدف الدرس

دوال تحتفظ بحالتها

01

الشرح

الدالة في Lua قيمة مثل الرقم والنصّ، فتستطيع أن تضعها في متغيّر، وأن تمرّرها إلى دالة، وأن تُرجعها من دالة أخرى. والدالة التي تعرّفها داخل دالة أخرى ترى متغيّراتها المحلية، وتحتفظ بها حتى بعد أن تنتهي الدالة الخارجية، وهذا ما يُسمّى الإغلاق (closure).

ومن الإغلاق جاء نمط المصنع (factory)، فـ makeCounter() تعرّف local count = 0 ثم تُرجع دالة تزيده. وكل استدعاء للمصنع يصنع count جديدًا، فيكون لكل عدّاد حالته الخاصّة التي لا يصل إليها أحد من الخارج. وبهذا النمط تُبنى مؤقّتات القدرات في الألعاب، فلكل قدرة وقت آخر استعمال خاصّ بها.

والخطأ الشائع أن تضع local count = 0 خارج المصنع، فتشترك العدّادات كلها في متغيّر واحد. وفي المؤقّت لا تسجّل الوقت إلا حين يُقبل الاستعمال، وإلا صارت كل محاولة مرفوضة تطيل الانتظار.

02

المطلوب

اكتب makeCounter() التي تُرجع دالة تعطي 1 ثم 2 ثم 3 مع كل استدعاء. ثم اكتب makeCooldown(seconds) التي تُرجع دالة use(now)، فإن كان هذا أول استعمال أو مضت seconds على آخر استعمال مقبول سجّلت now وأرجعت true، وإلا أرجعت false. والوقت now يصل وسيطًا، وفي اللعبة الحقيقية يأتي من ساعة المحرّك.

الفحوص

6 فحوص
  1. العدّاد يُرجع 1 ثم 2 ثم 3
  2. كل عدّاد مستقلّ بحالته
  3. الاستعمال الأول مسموح
  4. يُرفض قبل انقضاء المدّة ويُقبل عند تمامها
  5. المحاولة المرفوضة لا تعيد ضبط المؤقّت
  6. لكل قدرة مؤقّتها الخاصّ
main.lua
المخرجاتLua 5.4 (wasmoon)

نحمّل بيئة Lua الآن.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».