الدرس 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 مجموع المدفوع بـ reduce: 545
- بالاختصار &: مرّة على الأقل
- طُبع كل نصّ في سطر