Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ما هو الـ Closure؟

جزء من قسم المنطق والتحكم في التدفق في رحلة Lua على Coddy. الدرس 14 من 54.

لقد تعلّمت أن الدوال يمكن تخزينها في متغيرات، وتمريرها كوسائط، وإرجاعها من دوال أخرى. والآن سنستكشف إحدى أقوى النتائج المترتبة على ذلك: الإغلاقات.

يحدث الإغلاق عندما تقوم دالة متداخلة «بتذكّر» المتغيرات local من function التي تحتويها، حتى بعد أن تنتهي تلك function الخارجية من التنفيذ. قد يبدو هذا غريبًا في البداية؛ فكيف يمكن لمتغير أن يظل موجودًا بعد انتهاء function التي أنشأته؟

إليك مثالًا بسيطًا يوضّح هذا المفهوم:

function createCounter()
    local count = 0
    
    return function()
        count = count + 1
        return count
    end
end

local counter = createCounter()
print(counter())  -- الناتج: 1
print(counter())  -- الناتج: 2
print(counter())  -- الناتج: 3

عند استدعاء createCounter()، ينشئ متغيرًا محليًا count ويُرجع دالة مجهولة. عادةً، قد تتوقع أن يختفي count بمجرد انتهاء createCounter(). لكن الدالة المُرجعة لا تزال قادرة على الوصول إلى count. فهي «تُغلق على» ذلك المتغير.

في كل مرة تستدعي فيها counter()، تصل إلى متغير count نفسه الذي تم إنشاؤه عند تشغيل createCounter() لأول مرة وتعدّله. تحمل الدالة الداخلية بيئتها معها، فتحافظ على الحالة بين الاستدعاءات.

challenge icon

التحدي

سهل

اكتب دالة createMultiplier تنشئ دالة ضرب باستخدام عامل محدد، ثم تستخدمها مباشرةً لضرب رقم مُعطى.

المنطق:

  • أنشئ دالة متداخلة داخل createMultiplier تأخذ مُعامِل number
  • يجب أن تضرب الدالة المتداخلة مُعامِلها في factor من الدالة الخارجية
  • ستُشكّل الدالة المتداخلة إغلاقًا، وتتذكر قيمة factor
  • استدعِ دالة الضرب باستخدام مُعامِل number وأعد النتيجة

المُعامِلات:

  • factor (number): قيمة الضرب
  • number (number): الرقم المراد ضربه

القيمة المُعادة:

  • نتيجة ضرب number في factor (number)

جرّب بنفسك

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- استخدم الدالة multiply أدناه

end
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتحكم في التدفق

تدرّب بنفسك: مترجم Lua عبر الإنترنت