الدوال في Dart: المعاملات المسماة والسهمية
الدالة مجموعة أوامر لها اسم، تكتبها مرة وتستدعيها كلما احتجتها. وفي Dart للدوال أهمية خاصة: كل شيء في Flutter تقريباً يُبنى بدوال، وكل زر يستقبل دالة تُنفَّذ عند الضغط عليه. وستلاحظ في هذا الدرس أن طريقة Flutter في كتابة الـ Widgets تعتمد على ميزة اسمها المعاملات المسماة.
تعريف دالة
Section titled “تعريف دالة”void greet() { print('أهلاً بك في Dart!');}
int add(int a, int b) { return a + b;}
void main() { greet(); print(add(3, 4));}أهلاً بك في Dart!7- الكلمة قبل اسم الدالة هي نوع القيمة المرجعة:
intتُرجع رقماً، وvoidتعني «لا تُرجع شيئاً». - بين القوسين المعاملات بأنواعها:
int a, int b. returnتُرجع النتيجة وتُنهي الدالة.
حتى main نفسها دالة! هي نقطة البداية التي تشغّلها Dart أولاً.
الدوال السهمية
Section titled “الدوال السهمية”إذا كانت الدالة سطراً واحداً يُرجع قيمة، اختصرها بالسهم =>:
int square(int x) => x * x;
bool isEven(int n) => n % 2 == 0;=> x * x تساوي تماماً { return x * x; }. ستراها في كل مكان في Flutter.
المعاملات الاختيارية بالموضع
Section titled “المعاملات الاختيارية بالموضع”ضع المعاملات الاختيارية بين قوسين مربعين [ ]، وأعطها قيمة افتراضية أو اجعلها تقبل null:
String makeTea([int sugar = 2]) => 'شاي بـ $sugar ملاعق سكر';
String fullName(String first, [String? last]) { if (last == null) return first; return '$first $last';}
void main() { print(makeTea()); print(makeTea(0)); print(fullName('سارة')); print(fullName('سارة', 'أحمد'));}شاي بـ 2 ملاعق سكرشاي بـ 0 ملاعق سكرسارةسارة أحمدالمعاملات المسماة: أسلوب Flutter
Section titled “المعاملات المسماة: أسلوب Flutter”عندما يكثر عدد المعاملات، يصعب تذكر ترتيبها. ما معنى createUser('عمر', 15, 'جدة', true)؟ الحل: المعاملات المسماة بين قوسين معقوفين { }:
String createUser({ required String name, required int age, String city = 'القاهرة',}) { return '$name ($age سنة) من $city';}
void main() { print(createUser(name: 'عمر', age: 15)); print(createUser(age: 20, name: 'منى', city: 'جدة'));}عمر (15 سنة) من القاهرةمنى (20 سنة) من جدة- عند الاستدعاء تكتب اسم كل معامل:
name: 'عمر'، فيصبح الكود مقروءاً كجملة. - الترتيب لا يهم: لاحظ أننا كتبنا
ageقبلnameفي الاستدعاء الثاني. required: هذا المعامل إجباري رغم أنه مسمى.- المعامل بقيمة افتراضية مثل
cityاختياري.
تخيّل الفرق بين أن تملأ استمارة بلا عناوين للخانات، وبين استمارة مكتوب بجانب كل خانة «الاسم» و«العمر». المعاملات المسماة هي الاستمارة الواضحة.
الدوال كقيم
Section titled “الدوال كقيم”في Dart، الدالة قيمة مثل الأرقام والنصوص: تستطيع وضعها في متغير، وتمريرها لدالة أخرى:
int square(int x) => x * x;
int applyTwice(int Function(int) f, int x) => f(f(x));
void main() { int Function(int) op = square; print(op(6)); print(applyTwice(square, 2));}3616int Function(int) هو نوع الدالة: «دالة تأخذ int وتُرجع int». و applyTwice طبّقت square مرتين: مربع 2 هو 4، ومربع 4 هو 16.
الدوال المجهولة
Section titled “الدوال المجهولة”أحياناً تحتاج دالة صغيرة مرة واحدة فقط، فلا داعي لتسميتها:
var numbers = [1, 2, 3];
numbers.forEach((n) { print(n * 10);});
var doubled = numbers.map((n) => n * 2).toList();print(doubled);102030[2, 4, 6](n) { ... } و (n) => n * 2 دوال بلا اسم، مررناها مباشرة. وهكذا بالضبط ستكتب في Flutter: onPressed: () { ... } لتحدد ماذا يحدث عند الضغط على زر.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب دالة تحسب السعر بعد الخصم، والنسبة معامل مسمى قيمته الافتراضية 10:
double priceAfterDiscount(double price, {double percent = 10}) => price - price * percent / 100;
void main() { print(priceAfterDiscount(200)); print(priceAfterDiscount(200, percent: 25));}180.0150.0تحدٍّ: اكتب دالة describeStudent بمعاملين مسميين إجباريين name و score، تُرجع «ناجح» أو «راسب» مع الاسم.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان return في دالة لها نوع: المحرر يعترض، لأن الدالة وعدت بقيمة ولم تُرجعها.
- نسيان اسم المعامل عند الاستدعاء:
createUser('عمر', 15)خطأ مع المعاملات المسماة. الصحيحcreateUser(name: 'عمر', age: 15). - الخلط بين f و f():
onPressed: saveتمرر الدالة لتُنفَّذ لاحقاً، أماonPressed: save()فتنفذها فوراً وتمرر نتيجتها! خطأ شائع جداً في Flutter.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
كيف تستدعي void order({required String item, int qty = 1}) لطلب 3 أقلام؟
المعاملات المسماة تُكتب بأسمائها، و item إجباري فلا يمكن حذفه.
سؤال
ما الذي يساويه int triple(int x) => x * 3;؟
السهم => اختصار لـ { return ...; } في الدوال ذات التعبير الواحد.
الخلاصة
Section titled “الخلاصة”- الدالة تُعرَّف بنوع قيمتها المرجعة، و
voidلا تُرجع شيئاً. =>تختصر الدالة ذات التعبير الواحد.[ ]للمعاملات الاختيارية بالموضع، و{ }للمعاملات المسماة معrequiredوالقيم الافتراضية.- المعاملات المسماة هي أساس شكل كود Flutter.
- الدوال قيم: تُخزَّن في متغيرات، وتُمرر لدوال أخرى، وتُكتب مجهولة عند الحاجة.