yield وإنشاء دوال مخصصة
في الدرس السابق تعلمنا كيف نستخدم الكتل مع دوال مثل each و map و select. الآن حان الوقت لنتعلم كيف نُنشئ دوالنا الخاصة التي تقبل كتل برمجية!
ما هو yield؟
yield هي كلمة مفتاحية في روبي تعني "نفّذ الكتلة المُمرَّرة". عندما تكتب yield داخل دالة، روبي تُوقف تنفيذ الدالة مؤقتاً وتُنفّذ الكتلة التي مرَّرها المستدعي.
في هذا المثال:
- الدالة تطبع "قبل yield"
yieldيُنفّذ الكتلة{ puts "أنا داخل الكتلة!" }- الدالة تستمر وتطبع "بعد yield"
تمرير قيم إلى الكتلة
يمكن تمرير قيم من الدالة إلى الكتلة:
القيمة المُمرَّرة لـ yield تصبح معامل الكتلة (|name|).
تمرير قيم متعددة
استقبال قيمة من الكتلة
الكتلة تُرجع قيمة (آخر تعبير فيها)، ويمكن للدالة استخدامها:
yield المتعدد
يمكن استدعاء yield عدة مرات:
مثال: مكرر مخصص
التحقق من وجود كتلة
ماذا لو استدعى شخص الدالة بدون كتلة؟ استخدم block_given?:
مثال عملي: دالة مع قيمة افتراضية
إنشاء مكررات مخصصة
مثال 1: each للأرقام الزوجية
مثال 2: each مع فهرس مخصص
مثال 3: مكرر مع تصفية
yield مع إرجاع قيمة
الدالة يمكنها إرجاع نتيجة بناءً على yield:
أنماط شائعة مع yield
نمط 1: Wrapper (التغليف)
نمط 2: Setup/Teardown
نمط 3: التكرار المشروط
الفرق بين yield و call
سنتعرف على Procs في الدرس القادم، لكن للمقارنة السريعة:
| yield | Proc.call |
|---|---|
| ينفذ الكتلة المُمرَّرة ضمنياً | ينفذ كائن Proc صريحاً |
| أبسط في الكتابة | أكثر مرونة |
| لا يمكن تخزين الكتلة | يمكن تخزين Proc وتمريره |
جدول ملخص
| المفهوم | الوصف | مثال |
|---|---|---|
yield | تنفيذ الكتلة | yield |
yield(value) | تمرير قيمة للكتلة | yield(5) |
block_given? | التحقق من وجود كتلة | if block_given? |
| قيمة yield | استقبال قيمة من الكتلة | result = yield |
أمثلة عملية
مثال 1: معالجة قائمة مهام
مثال 2: بناء HTML بسيط
مثال 3: مكرر للأعداد الأولية
أخطاء شائعة
1. استدعاء yield بدون كتلة
2. نسيان قيمة yield
تمرين: إنشاء مكرر مخصص
حان وقت التطبيق! في محرر الشيفرة على اليسار:
المطلوب:
- أنشئ دالة
each_wordتستقبل نصاً - الدالة تُقسّم النص إلى كلمات وتُمرر كل كلمة للكتلة
- استخدم الدالة لطباعة كل كلمة من جملة "روبي لغة برمجة رائعة"
الناتج المتوقع:
تلميحات:
- استخدم
splitلتقسيم النص إلى مصفوفة كلمات - استخدم
eachللتكرار على الكلمات - داخل التكرار، استخدم
yield(word)لتمرير الكلمة للكتلة
تذكّر:
yieldتجعل دوالك أكثر مرونة! بدلاً من تحديد ما تفعله الدالة بالضبط، يمكنك ترك القرار للمستدعي عبر الكتلة.