الدرس 5 من 10
الكتل والتكرار
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الدوال map وselect وreduce
الشرح
الكتلة (block) قطعة كود تمرّرها إلى دالة فتنفّذها الدالة على كل عنصر، مثل prices.each { |p| puts p }، والاسم بين الخطّين العموديين هو اسم العنصر في كل دورة. وتُكتب الكتلة بشكلين: { } للسطر الواحد، وdo ... end لما يمتدّ على عدّة أسطر.
وأغلب ما تفعله بالمصفوفات يعتمد على الكتل، فـ map تحوّل كل عنصر وتُرجع مصفوفة بالنتائج، وselect تُبقي العناصر التي يتحقّق فيها شرط الكتلة، وreject تحذفها، وreduce تجمع المصفوفة كلها في قيمة واحدة مثل reduce(0) { |sum, p| sum + p }. وإذا كانت الكتلة لا تفعل إلا استدعاء دالة واحدة على العنصر فاختصرها، فـ prices.reject(&:zero?) تعني prices.reject { |p| p.zero? }.
وانتبه إلى أنّ each تُستعمل لتنفيذ عمل على كل عنصر كالطباعة، وتُرجع المصفوفة الأصلية وليس نتائج الكتلة، فـ labels = prices.each { |p| "#{p} ر.س" } تعطيك الأرقام نفسها وتضيع النصوص دون أي تنبيه. فإذا أردت مصفوفة جديدة فاستعمل map.
المطلوب
اصنع من prices المصفوفة paid بلا الهدايا المجانية (سعرها صفر) باستعمال reject والاختصار &:. ثم اصنع من paid ثلاث قيم: premium فيها ما سعره 100 فأكثر بـ select، وlabels نصوصًا بالشكل "120 ر.س" بـ map، وtotal مجموع الأسعار بـ reduce. وأخيرًا اطبع كل نصّ من labels في سطر مستقلّ بـ each وdo ... end.
الفحوص
6 فحوص- المصفوفة paid بلا الهدايا المجانية
- المصفوفة premium فيها ما سعره 100 فأكثر
- عناصر labels نصوص وليست أرقامًا (map وليس each)
- المتغيّر total يساوي 545 ومحسوب بـ reduce
- استُعمل الاختصار &: مرّة على الأقل
- طُبع كل نصّ في سطر مستقلّ