yield وإنشاء دوال مخصصة

تعديل
نسخ الدرس
تحميل الدرس

yield وإنشاء دوال مخصصة

في الدرس السابق تعلمنا كيف نستخدم الكتل مع دوال مثل each و map و select. الآن حان الوقت لنتعلم كيف نُنشئ دوالنا الخاصة التي تقبل كتل برمجية!

ما هو yield؟

yield هي كلمة مفتاحية في روبي تعني "نفّذ الكتلة المُمرَّرة". عندما تكتب yield داخل دالة، روبي تُوقف تنفيذ الدالة مؤقتاً وتُنفّذ الكتلة التي مرَّرها المستدعي.

في هذا المثال:

  1. الدالة تطبع "قبل yield"
  2. yield يُنفّذ الكتلة { puts "أنا داخل الكتلة!" }
  3. الدالة تستمر وتطبع "بعد yield"

تمرير قيم إلى الكتلة

يمكن تمرير قيم من الدالة إلى الكتلة:

القيمة المُمرَّرة لـ yield تصبح معامل الكتلة (|name|).

تمرير قيم متعددة

استقبال قيمة من الكتلة

الكتلة تُرجع قيمة (آخر تعبير فيها)، ويمكن للدالة استخدامها:

yield المتعدد

يمكن استدعاء yield عدة مرات:

مثال: مكرر مخصص

التحقق من وجود كتلة

ماذا لو استدعى شخص الدالة بدون كتلة؟ استخدم block_given?:

مثال عملي: دالة مع قيمة افتراضية

إنشاء مكررات مخصصة

مثال 1: each للأرقام الزوجية

مثال 2: each مع فهرس مخصص

مثال 3: مكرر مع تصفية

yield مع إرجاع قيمة

الدالة يمكنها إرجاع نتيجة بناءً على yield:

أنماط شائعة مع yield

نمط 1: Wrapper (التغليف)

نمط 2: Setup/Teardown

نمط 3: التكرار المشروط

الفرق بين yield و call

سنتعرف على Procs في الدرس القادم، لكن للمقارنة السريعة:

yieldProc.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

تمرين: إنشاء مكرر مخصص

حان وقت التطبيق! في محرر الشيفرة على اليسار:

المطلوب:

  1. أنشئ دالة each_word تستقبل نصاً
  2. الدالة تُقسّم النص إلى كلمات وتُمرر كل كلمة للكتلة
  3. استخدم الدالة لطباعة كل كلمة من جملة "روبي لغة برمجة رائعة"

الناتج المتوقع:

تلميحات:

  • استخدم split لتقسيم النص إلى مصفوفة كلمات
  • استخدم each للتكرار على الكلمات
  • داخل التكرار، استخدم yield(word) لتمرير الكلمة للكتلة

تذكّر: yield تجعل دوالك أكثر مرونة! بدلاً من تحديد ما تفعله الدالة بالضبط، يمكنك ترك القرار للمستدعي عبر الكتلة.