✅ أولًا: ما هي الدوال المجهولة (Anonymous Function)؟
هي دوال ليس لها اسم، وتُستخدم غالبًا:
- كمُعامل داخل دوال أخرى.
- أو عندما تكون الدالة بسيطة ولا حاجة لتكرارها.
يتم تعريفها مثل أي دالة، ولكن دون اسم.
✅ الصيغة العامة:
(parameter1, parameter2, ...) {
// جسم الدالة
};
JavaScript
✅ المميزات والفوائد:
الفائدة | الشرح |
---|
✅ بدون اسم | لا تحتاج لتعريف اسم للدالة — مفيدة للكود المؤقت أو البسيط. |
✅ تستخدم داخل المتغيرات أو القوائم أو الدوال | مثالية عند الحاجة لدالة لمرة واحدة فقط. |
✅ تدعم الوصول للمتغيرات من السياق الخارجي (Closure) | يمكن استخدامها للوصول إلى متغيرات من المحيط. |
✅ تسهّل العمل مع الدوال التي تتطلب Callbacks | مثل forEach , map , where , أو في واجهات المستخدم. |
✅ أين تُستخدم؟
- داخل توابع مثل
forEach
, map
, sort
.
- كمُعامل (callback) في أزرار الضغط أو الأحداث في تطبيقات Flutter.
- في تعريف المتغيرات التي تمثل دالة.
- في عمليات الفلترة أو التحويل على القوائم.
✅ 🧪 الأمثلة التفصيلية:
✅ مثال 1: استخدام Anonymous Function مع forEach
void main() {
List<String> names = ['Yasin', 'Ali', 'Sara'];
names.forEach((name) {
print("Hello $name");
});
}
JavaScript
forEach
تتوقع دالة كمُعامل.
- أعطيناها دالة مجهولة تطبع الاسم.
✅ مثال 2: تخزين دالة مجهولة في متغير
🧾 الشرح:
void main() {
var greet = () {
print("Welcome to Dart!");
};
greet(); // استدعاء الدالة المجهولة من المتغير
}
JavaScript
🧾 الشرح:
- خزّنا الدالة في متغير.
- أصبح بإمكاننا استخدامها مثل أي دالة عادية.
✅ مثال 3: دالة مجهولة تُرجع قيمة
void main() {
var getNumber = () {
return 42;
};
print("Lucky Number: ${getNumber()}");
}
JavaScript
🧾 الشرح:
- دالة بدون اسم تعيد رقم.
- تم تخزينها في متغير واستدعاؤها لاحقًا.
✅ مثال 4: استخدام في map لتحويل قائمة
void main() {
List<int> numbers = [1, 2, 3];
List<int> squared = numbers.map((num) {
return num * num;
}).toList();
print(squared); // [1, 4, 9]
}
JavaScript
✅ الفرق بينها وبين الدوال العادية:
المقارنة | دالة عادية | دالة مجهولة |
---|
لها اسم؟ | ✅ نعم | ❌ لا |
إعادة الاستخدام؟ | ✅ ممكن بسهولة | ❌ صعب إلا بحفظها في متغير |
مكان التعريف | غالبًا خارج الدوال | غالبًا داخل دوال أخرى |
✅ محاذير وملاحظات:
- لا تستخدم الدوال المجهولة إذا كانت المهمة معقدة أو متكررة — الأفضل وقتها استخدام دالة عادية باسم واضح.
- إن أردت أن تكون الدالة المجهولة تعود بقيمة، تأكد من استخدام
return
بداخلها.
- يمكن أن تكون
async
أو =>
أيضًا: dartCopyEditvar greet = () => print("Hi from arrow anonymous function!");
✅ الخلاصة:
- الدالة المجهولة = دالة بدون اسم، تُستخدم عادة داخل دوال أخرى أو لمهام بسيطة.
- مفيدة جدًا في العمليات اللحظية والتعامل مع القوائم والأحداث.
- يمكنها استقبال معطيات، إعادة قيم، وحتى أن تكون
async
.
✅ ما هي الدوال السهمية (Arrow Functions) في Dart؟
📌 التعريف:
الدالة السهمية هي اختصار لكتابة الدالة التي تحتوي على تعليم واحد فقط (سطر واحد)، باستخدام الرمز =>
بدلاً من { return ...; }
.
✅ الصيغة العامة:
returnType functionName(parameters) => expression;
JavaScript
- لا تحتاج إلى
{}
أو return
.
- تستخدم فقط إذا كان هناك سطر واحد فقط في جسم الدالة.
✅ مثال بسيط:
int square(int x) => x * x;
void main() {
print(square(4)); // 16
}
JavaScript
✅ مقارنة بين الدالة العادية والسهمية:
الدالة العادية | الدالة السهمية |
---|
int add(int x, int y) { return x + y; } | int add(int x, int y) => x + y; |
تحتاج إلى {} و return | تستخدم => وتستغني عن return |
تصلح لأي تعبير | تصلح فقط لسطر واحد |
✅ المميزات والفوائد:
الميزة | الفائدة |
---|
✅ كتابة مختصرة | تجعل الكود أنظف وأسهل للقراءة. |
✅ مثالية للوظائف البسيطة | مثل الحسابات أو التحويلات السريعة. |
✅ تُستخدم مع الدوال الأخرى | مفيدة جدًا في map , forEach , sort , إلخ. |
✅ تدعم أنواع الإرجاع مثل العادية | سواء int , String , void , إلخ. |
✅ أمثلة توضيحية متنوعة:
🧪 مثال 1: دالة ترجّع عدد مربع
int square(int x) => x * x;
void main() {
print(square(5)); // 25
}
JavaScript
🧪 مثال 2: دالة بدون إرجاع (void)
void greet() => print("Hello, Yasin!");
void main() {
greet(); // Hello, Yasin!
}
JavaScript
🧪 مثال 3: دالة سهمية تستخدم داخل map
void main() {
List<int> numbers = [1, 2, 3];
var doubled = numbers.map((n) => n * 2).toList();
print(doubled); // [2, 4, 6]
}
JavaScript
🧪 مثال 4: دالة سهمية ترجع شرط منطقي
bool isEven(int x) => x % 2 == 0;
void main() {
print(isEven(4)); // true
print(isEven(7)); // false
}
JavaScript
⚠️ المحاذير والتنبيهات:
التحذير | السبب |
---|
❌ لا تستخدم إذا كانت الدالة تحتوي على أكثر من سطر | الدوال السهمية مخصصة لسطر واحد فقط. |
❌ لا يمكن استخدام return داخل => | لأن Dart تفترض أن السطر الوحيد هو ما سيتم إرجاعه. |
❌ تجنب استخدامها في العمليات المعقدة | للحفاظ على وضوح الكود. |
✅ متى تستخدم الدوال السهمية؟
الاستخدام | هل تُناسب الدوال السهمية؟ |
---|
دالة قصيرة (حساب – شرط – طباعة) | ✅ نعم |
أكثر من سطر واحد (مثل if أو for) | ❌ لا |
داخل map / where / sort | ✅ مثالي |
داخل واجهات المستخدم Flutter | ✅ شائع جداً |
✅ ملخص سريع:
النوع | الصيغة | مناسب لـ |
---|
دالة سهمية ترجع قيمة | int f(x) => x * x; | الحسابات السريعة |
دالة سهمية void | void f() => print("Hello"); | الطباعة |
في map | list.map((x) => x + 1) | تعديل عناصر القوائم |