ما هو الـ 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() لأول مرة. تحمل الدالة الداخلية بيئتها معها، مما يحافظ على الحالة بين الاستدعاءات.
التحدي
سهلاكتب دالة 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التكرار المتقدم عبر الجداول
التكرار باستخدام pairs()التكرار باستخدام ipairs()pairs() مقابل ipairs()مراجعة - ورقة الشخصية2المزيد من دوال مكتبة Table
table.concat()إنشاء الجداول و unpack()table.sort()فرز مخصص باستخدام الدوالمراجعة - لوحة أعلى النتائج3مفاهيم الدوال المتقدمة
إرجاع قيم متعددةالدوال متغيرة الوسائط (...)الدوال كقيم من الدرجة الأولىالدوال المجهولةما هو الـ Closure؟ملخص - معالج أحداث بسيط