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

ما هو الـ Closure؟

جزء من قسم Logic & Flow في رحلة Lua على Coddy — الدرس 14 من 54.

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

يحدث الإغلاق (closure) عندما "تتذكر" الدالة المتداخلة المتغيرات المحلية من الدالة المحيطة بها، حتى بعد انتهاء تنفيذ تلك الدالة الخارجية. قد يبدو هذا غريبًا في البداية—كيف يمكن لمتغير أن يظل موجودًا بعد انتهاء الدالة التي أنشأته؟

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

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—فهي "تغلق على" (closes over) ذلك المتغير.

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

challenge icon

التحدي

سهل

اكتب دالة createMultiplier تقوم بإنشاء دالة مضاعفة بعامل محدد، ثم تستخدمها فوراً لضرب رقم معين.

المنطق:

  • قم بإنشاء دالة متداخلة داخل createMultiplier تأخذ معامل رقمي
  • يجب أن تقوم الدالة المتداخلة بضرب المعامل الخاص بها في الـ factor من الدالة الخارجية
  • ستقوم الدالة المتداخلة بتكوين closure، حيث تتذكر قيمة الـ factor
  • استدعِ دالة المضاعف مع المعامل number وأرجع النتيجة

المعاملات:

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

القيمة المرجعة:

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

ورقة مرجعية

يحدث الـ closure عندما "تتذكر" دالة متداخلة المتغيرات المحلية من الدالة المحيطة بها، حتى بعد انتهاء تنفيذ تلك الدالة الخارجية.

تحمل الدالة الداخلية بيئتها معها، مما يحافظ على الحالة بين الاستدعاءات:

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—فهي "تغلق على" (closes over) ذلك المتغير، حتى بعد انتهاء تنفيذ الدالة الخارجية.

جرّب بنفسك

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

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

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

جميع دروس Logic & Flow