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

فهم الـ Closures

جزء من قسم المنطق وتدفق التنفيذ في رحلة Dart على Coddy. الدرس 46 من 65.

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

عندما تنشئ function داخل function أخرى، يكون لدى function الداخلية وصول إلى متغيرات function الخارجية. وما يجعلها closure هو أن هذا الوصول يستمر حتى بعد أن تكون function الخارجية قد completed تنفيذها.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

في هذا المثال، الدالة المجهولة التي تُرجعها createGreeting هي إغلاق. فهي تلتقط المعامل name من النطاق المحيط بها. حتى بعد انتهاء تشغيل createGreeting، تظل الدالة المُرجعة تتذكر قيمة name.

تُعدّ عمليات الإغلاق مفيدة للغاية لإنشاء دوال متخصصة أو الحفاظ على الحالة بطريقة نظيفة. فهي تتيح لك إنشاء دوال مخصّصة استنادًا إلى البيئة التي أُنشئت فيها، مما يجعل التعليمات البرمجية أكثر مرونة وقوة.

challenge icon

التحدي

سهل

Create برنامجًا يوضح الإغلاقات من خلال بناء نظام مولّد رسائل مخصّصة. سينشئ برنامجك دوالًا "تتذكر" معلومات محددة وتستخدم تلك المعلومات لإنشاء رسائل مخصّصة حتى بعد انتهاء السياق الأصلي.

  1. اقرأ مُدخلًا نصيًا يمثّل اسم شخص
  2. اقرأ مُدخلًا نصيًا يمثّل نوع التحية ("formal" أو "casual" أو "friendly")
  3. اقرأ مُدخلًا نصيًا يمثّل اسم شركة
  4. Create function باسم createMessageGenerator يأخذ الاسم ونوع التحية كمعاملين
  5. يجب أن تُرجع function createMessageGenerator function أخرى (إغلاقًا) تقوم بما يلي:
    • تأخذ اسم الشركة كمعامل لها
    • تستخدم الاسم ونوع التحية من نطاق 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]!"
  6. استدعِ function createMessageGenerator باستخدام مُدخلَي الاسم ونوع التحية للحصول على function الإغلاق الخاصة بك
  7. استدعِ function الإغلاق المُرجعة باستخدام مُدخل اسم الشركة لإنشاء الرسالة
  8. اعرض النتائج بالتنسيق الدقيق الموضّح أدناه

على سبيل المثال، إذا كانت المُدخلات هي "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");
}
quiz iconاختبر نفسك

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

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

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