فهم الـ Closures
جزء من قسم المنطق وتدفق التنفيذ في رحلة Dart على Coddy. الدرس 46 من 65.
الإغلاق هو نوع خاص من الدوال "يتذكّر" المتغيرات من المكان الذي أُنشئ فيه، حتى بعد انتهاء تشغيل السياق الأصلي. فكّر فيه على أنه دالة تحمل معها جزءًا من موطن نشأتها أينما ذهبت.
عندما تنشئ function داخل function أخرى، يكون لدى function الداخلية وصول إلى متغيرات function الخارجية. وما يجعلها closure هو أن هذا الوصول يستمر حتى بعد أن تكون function الخارجية قد completed تنفيذها.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}في هذا المثال، الدالة المجهولة التي تُرجعها createGreeting هي إغلاق. فهي تلتقط المعامل name من النطاق المحيط بها. حتى بعد انتهاء تشغيل createGreeting، تظل الدالة المُرجعة تتذكر قيمة name.
تُعدّ عمليات الإغلاق مفيدة للغاية لإنشاء دوال متخصصة أو الحفاظ على الحالة بطريقة نظيفة. فهي تتيح لك إنشاء دوال مخصّصة استنادًا إلى البيئة التي أُنشئت فيها، مما يجعل التعليمات البرمجية أكثر مرونة وقوة.
التحدي
سهلCreate برنامجًا يوضح الإغلاقات من خلال بناء نظام مولّد رسائل مخصّصة. سينشئ برنامجك دوالًا "تتذكر" معلومات محددة وتستخدم تلك المعلومات لإنشاء رسائل مخصّصة حتى بعد انتهاء السياق الأصلي.
- اقرأ مُدخلًا نصيًا يمثّل اسم شخص
- اقرأ مُدخلًا نصيًا يمثّل نوع التحية (
"formal"أو"casual"أو"friendly") - اقرأ مُدخلًا نصيًا يمثّل اسم شركة
- Create function باسم
createMessageGeneratorيأخذ الاسم ونوع التحية كمعاملين - يجب أن تُرجع function
createMessageGeneratorfunction أخرى (إغلاقًا) تقوم بما يلي: - تأخذ اسم الشركة كمعامل لها
- تستخدم الاسم ونوع التحية من نطاق function الخارجية
- تُرجع رسالة منسّقة استنادًا إلى نوع التحية:
- بالنسبة إلى
"formal":"Dear [name], we are pleased to welcome you to [company]." - بالنسبة إلى
"casual":"Hey [name]! Welcome to [company]!" - بالنسبة إلى
"friendly":"Hi [name], so glad you joined [company]!" - استدعِ function
createMessageGeneratorباستخدام مُدخلَي الاسم ونوع التحية للحصول على function الإغلاق الخاصة بك - استدعِ function الإغلاق المُرجعة باستخدام مُدخل اسم الشركة لإنشاء الرسالة
- اعرض النتائج بالتنسيق الدقيق الموضّح أدناه
على سبيل المثال، إذا كانت المُدخلات هي "Alice" و"formal" و"TechCorp"، فيجب أن يُخرج برنامجك:
Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfullyإذا كانت المُدخلات هي "Bob" و"casual" و"StartupXYZ"، فيجب أن يُخرج برنامجك:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullyإذا كانت المُدخلات هي "Carol" و"friendly" و"InnovateLab"، فيجب أن يُخرج برنامجك:
Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfullyيجب أن يوضح برنامجك الإغلاقات من خلال إنشاء function تُرجع function أخرى. يجب أن تتمكن function المُرجعة (الإغلاق) من الوصول إلى المتغيرات الموجودة في نطاق function الخارجية (الاسم ونوع التحية) حتى بعد انتهاء تنفيذ function الخارجية. استخدم عبارات شرطية لتحديد تنسيق الرسالة المناسب استنادًا إلى مُدخل نوع التحية.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة الإدخال
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// عرض ترويسة النظام
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: اكتب الكود الخاص بك أدناه
// Create the createMessageGenerator function that returns a closure
// استدعِ الدالة وأنشئ الرسالة
// إخراج النتائج النهائية
print("Generated message: \$message");
print("Message generation completed successfully");
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدةتدرّب بنفسك: مترجم Dart عبر الإنترنت