الدوال المجهولة
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 44 من 65.
حتى الآن، كنت تقوم بإنشاء دوال بأسماء مثل calculateTotal أو printMessage. ولكن في بعض الأحيان تحتاج إلى دالة بسيطة لمهمة محددة واحدة فقط، ويشعر إعطاؤها اسماً بأنه غير ضروري. هنا تبرز فائدة الدوال المجهولة (anonymous functions).
الدالة المجهولة (anonymous function) هي دالة بدون اسم. تقوم بتعريفها في المكان الذي تحتاجها فيه تماماً، مما يجعل كودك أكثر إيجازاً للعمليات القصيرة التي تُنفذ لمرة واحدة. بنية الكتابة (syntax) بسيطة - ما عليك سوى كتابة قائمة المعاملات متبوعة بجسم الدالة:
(parameter) {
// جسم الدالة
}تُعد الدوال المجهولة (Anonymous functions) مفيدة بشكل خاص مع دوال القوائم (list methods). على سبيل المثال، بدلاً من إنشاء دالة منفصلة ومسماة لطباعة كل عنصر في القائمة، يمكنك استخدام دالة مجهولة مباشرة مع دالة forEach:
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {
print(fruit);
});هذا النهج يحافظ على نظافة وتركيز الكود الخاص بك، خاصة عندما يكون منطق الدالة بسيطاً ولن يتم إعادة استخدامه في مكان آخر في برنامجك.
التحدي
سهلقم بإنشاء برنامج يعالج قائمة بأسماء الموظفين باستخدام الدوال المجهولة (anonymous functions). سيقوم برنامجك بتوضيح كيفية استخدام الدوال المجهولة مع التابع forEach لإجراء عمليات مختلفة على كل عنصر من عناصر القائمة.
- اقرأ مدخلاً نصياً يحتوي على أسماء الموظفين مفصولة بفاصلة (على سبيل المثال،
"Alice,Bob,Charlie,Diana") - قم بتقسيم نص المدخلات إلى قائمة من الأسماء الفردية باستخدام التابع
split() - استخدم التابع
forEachمع دالة مجهولة لطباعة اسم كل موظف مع رسالة ترحيب - استخدم التابع
forEachمع دالة مجهولة أخرى لطباعة اسم كل موظف بالأحرف الكبيرة (uppercase) - استخدم التابع
forEachمع دالة مجهولة ثالثة لطباعة اسم كل موظف مع عدد أحرفه
على سبيل المثال، إذا كان المدخل هو "Alice,Bob,Charlie"، يجب أن يقوم برنامجك بإخراج ما يلي:
Processing employee list: Alice,Bob,Charlie
===========================================
Welcome Messages:
Welcome to the team, Alice!
Welcome to the team, Bob!
Welcome to the team, Charlie!
===========================================
Names in Uppercase:
ALICE
BOB
CHARLIE
===========================================
Name Lengths:
Alice has 5 characters
Bob has 3 characters
Charlie has 7 charactersإذا كان المدخل هو "John,Sarah"، يجب أن يقوم برنامجك بإخراج ما يلي:
Processing employee list: John,Sarah
===========================================
Welcome Messages:
Welcome to the team, John!
Welcome to the team, Sarah!
===========================================
Names in Uppercase:
JOHN
SARAH
===========================================
Name Lengths:
John has 4 characters
Sarah has 5 charactersيجب أن يستخدم برنامجك ثلاث استدعاءات منفصلة للتابع forEach، كل منها بدالة مجهولة خاصة بها. يجب تعريف الدوال المجهولة بشكل مضمن (inline) دون تسميتها. يجب أن تأخذ كل دالة مجهولة معاملاً واحداً يمثل اسم الموظف الحالي وتؤدي العملية المحددة. استخدم استيفاء النصوص (string interpolation) لتنسيق رسائل المخرجات تماماً كما هو موضح أعلاه.
ورقة مرجعية
الدالة المجهولة (anonymous function) هي دالة بدون اسم، يتم تعريفها في المكان الذي تحتاجها فيه تماماً. يستخدم بناء الجملة قائمة المعلمات متبوعة بجسم الدالة:
(parameter) {
// جسم الدالة
}الدوال المجهولة مفيدة بشكل خاص مع طرق القوائم (list methods) مثل forEach:
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {
print(fruit);
});يحافظ هذا النهج على نظافة الكود وتركيزه للعمليات البسيطة التي تُنفذ لمرة واحدة ولن يتم إعادة استخدامها في مكان آخر.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة سلسلة الإدخال التي تحتوي على أسماء الموظفين
String? input = stdin.readLineSync();
// تقسيم الإدخال إلى قائمة من الأسماء
List<String> employeeNames = input!.split(',');
// طباعة رسالة المعالجة الأولية
print('Processing employee list: $input');
print('===========================================');
// TODO: اكتب الكود الخاص بك أدناه
// استخدم forEach مع دوال مجهولة لـ:
// 1. طباعة رسائل الترحيب
// 2. طباعة الأسماء بأحرف كبيرة
// 3. طباعة أطوال الأسماء
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
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المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة