الدوال (Functions) هي كتل من التعليمات التي تؤدي مهمة محددة. في دارت، الدوال هي كائنات من الدرجة الأولى، مما يعني أنه يمكن تخزينها في متغيرات وتمريرها كوسيطات.
تعريف الدوال البسيطة
// دالة تقوم بالجمع وترجع قيمة
int add(int a, int b) {
return a + b;
}
// دالة بدون قيمة إرجاع
void printInfo(String name, int age) {
print('الاسم: $name، العمر: $age');
}
void main() {
int sum = add(5, 3);
print('المجموع: $sum');
printInfo('أحمد', 25);
}
المعاملات الاختيارية
// معاملات اختيارية (باستخدام أقواس مربعة)
String greet(String name, [String? title]) {
if (title != null) {
return 'مرحبًا $title $name';
}
return 'مرحبًا $name';
}
// معاملات اختيارية مع قيم افتراضية
void printDetails(String name, [int age = 20, String country = 'مصر']) {
print('$name، $age سنة، من $country');
}
void main() {
print(greet('محمد')); // مرحبًا محمد
print(greet('فاطمة', 'د.')); // مرحبًا د. فاطمة
printDetails('علي'); // علي، 20 سنة، من مصر
printDetails('سارة', 25); // سارة، 25 سنة، من مصر
printDetails('خالد', 30, 'السعودية'); // خالد، 30 سنة، من السعودية
}
المعاملات المسماة
// معاملات مسماة (باستخدام أقواس معقوفة)
void createUser({String? name, int? age, String? email}) {
print('تم إنشاء مستخدم:');
if (name != null) print('- الاسم: $name');
if (age != null) print('- العمر: $age');
if (email != null) print('- البريد: $email');
}
// معاملات مسماة إلزامية (باستخدام required)
void registerUser({required String username, required String password, String? phone}) {
print('تم تسجيل المستخدم: $username');
// عمليات التسجيل...
}
void main() {
// يمكن تقديم المعاملات بأي ترتيب
createUser(
email: '[email protected]',
name: 'أحمد',
age: 30,
);
// يمكن تخطي المعاملات الاختيارية
createUser(
name: 'محمد',
age: 25,
);
// المعاملات المطلوبة إلزامية
registerUser(
username: 'user123',
password: 'password123',
// phone غير إلزامي
);
}
دوال الأسهم (Arrow Functions)
// دالة تقليدية
int multiply(int a, int b) {
return a * b;
}
// نفس الدالة باستخدام صيغة الأسهم المختصرة
int multiplyArrow(int a, int b) => a * b;
// دالة سهم مع جملة شرطية
String getStatus(int score) => score >= 60 ? 'ناجح' : 'راسب';
void main() {
print('5 × 3 = ${multiply(5, 3)}');
print('4 × 7 = ${multiplyArrow(4, 7)}');
print('حالة الطالب: ${getStatus(75)}');
}
الدوال المجهولة
void main() {
// تعريف دالة مجهولة وتخزينها في متغير
var sayHello = (String name) {
return 'مرحبًا $name';
};
// استدعاء الدالة المجهولة
print(sayHello('أحمد'));
// دالة مجهولة بصيغة السهم
var square = (int x) => x * x;
print('مربع 4 = ${square(4)}');
// استخدام الدالة المجهولة مباشرة دون تخزين
print(((int x, int y) => x + y)(5, 3)); // 8
// استخدام دوال مجهولة مع دوال أخرى
List numbers = [1, 2, 3, 4, 5];
// تطبيق دالة على كل عنصر
var doubled = numbers.map((number) => number * 2);
print(doubled); // (2, 4, 6, 8, 10)
// تصفية العناصر
var evens = numbers.where((number) => number % 2 == 0);
print(evens); // (2, 4)
}
الدوال كمعاملات
// تعريف نوع الدالة
typedef MathOperation = int Function(int, int);
// دالة تستقبل دالة أخرى كمعامل
int calculate(int a, int b, MathOperation operation) {
return operation(a, b);
}
// الدوال التي سنستخدمها كمعاملات
int add(int a, int b) => a + b;
int subtract(int a, int b) => a - b;
int multiply(int a, int b) => a * b;
void main() {
// استخدام دوال مختلفة مع نفس دالة الحساب
print('10 + 5 = ${calculate(10, 5, add)}');
print('10 - 5 = ${calculate(10, 5, subtract)}');
print('10 × 5 = ${calculate(10, 5, multiply)}');
// استخدام دالة مجهولة
int result = calculate(10, 5, (a, b) => a ~/ b);
print('10 ÷ 5 = $result');
}