الدرس 10 من 10
النطاق وlocal
- 11 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الكلمة local والتظليل والاستدعاء الذاتي
الشرح
كل متغيّر تعرّفه دون local يكون عامًّا، فيُحفظ في الجدول _G ويراه كل كود يعمل في البيئة نفسها. وإضافات World of Warcraft كلها تشترك في جدول عامّ واحد، فقد يمحو total العامّ في إضافتك متغيّر total في إضافة أخرى. أما المتغيّر المحلي فيعيش من سطر تعريفه إلى end الكتلة التي هو فيها، والوصول إليه أسرع.
وإذا كتبت local داخل كتلة باسم موجود فأنت تصنع متغيّرًا جديدًا يخفي الخارجي ولا يغيّره، وهذا ما يُسمّى التظليل (shadowing)، فـ local score = score + 10 داخل الدالة تقرأ المتغيّر الخارجي وتكتب في نسخة جديدة تختفي عند end. ولكي تعدّل المتغيّر الخارجي أسند إليه القيمة دون local.
والدالة التي تستدعي نفسها تحتاج أن يكون اسمها معروفًا داخلها. ففي local f = function() ... f() ... end لا يوجد f المحلي إلا بعد انتهاء السطر كله، فيبحث الاستدعاء الداخلي عن f عامّ فيجده nil. أما local function f() فتعرّف الاسم أوّلًا ثم تضع فيه الدالة، فتراه الدالة من داخلها.
المطلوب
في الكود ثلاثة أخطاء في النطاق، فأصلحها: اجعل addKill تزيد score الخارجي 10، واجعل chainDamage تستدعي نفسها وتبقى محلية، واجعل endRound تُرجع النقاط وتصفّرها دون أن تترك total متغيّرًا عامًّا.
الفحوص
5 فحوص- الدالة addKill تزيد المتغيّر الخارجي score بمقدار 10
- الدالة chainDamage تستدعي نفسها وتعطي 187 لثلاث قفزات
- الدالة endRound تُرجع النقاط وتصفّرها
- المتغيّر total لا يبقى عامًّا
- الدوال محلية ولا يوجد شيء منها في _G