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