الدرس 10 من 10
تقارير Enumerable
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
جمّع وعُدّ ورتّب
الشرح
التقارير تطرح الأسئلة نفسها دائمًا: كم المجموع؟ وكم مرّة تكرّرت كل قيمة؟ وما نصيب كل فئة؟ ومن في الصدارة؟ وتجيب عنها Enumerable بدوال تستطيع أن تستدعيها واحدة بعد الأخرى، فـ sum تجمع ما تُرجعه الكتلة، وtally تعدّ تكرار كل قيمة وتضع النتيجة في هاش، وgroup_by تقسم العناصر مجموعات بحسب ما تُرجعه الكتلة، وsort_by ترتّب بالقيمة التي تختارها، وإذا جعلتها سالبة انعكس الترتيب.
أما each_with_object(Hash.new(0)) فتبني النتيجة أثناء المرور على العناصر، إذ تعطي الكتلة كل عنصر ومعه مُجمِّع (accumulator) واحد تجمع فيه النتيجة، ثم تُرجع المُجمِّع في النهاية. وHash.new(0) هاش قيمته الافتراضية صفر، لذلك تعمل acc[city] += total من أول مرّة تظهر فيها المدينة.
وانتبه إلى ترتيب المعاملين، فـ each_with_object تمرّر |order, acc|، أي العنصر أوّلًا ثم المُجمِّع، وهذا عكس reduce التي تمرّر |acc, order|. فإذا قلبتهما صار الطلب هو المُجمِّع، وظهر لك خطأ غامض عن nil.
المطلوب
احسب من orders ما يلي: revenue مجموع الطلبات بـ sum، وcounts عدد طلبات كل مدينة بـ tally، وby_city الطلبات مجمّعة حسب المدينة بـ group_by، وcity_totals إيراد كل مدينة بـ each_with_object، وranking أزواج المدن وإيراداتها مرتّبة من الأعلى إلى الأدنى بـ sort_by. ثم اطبع لكل مدينة سطرًا فيه اسمها وإيرادها بترتيب ranking.
الفحوص
6 فحوص- المتغيّر revenue هو مجموع كل الطلبات
- القاموس counts فيه عدد طلبات كل مدينة
- القاموس by_city يجمع الطلبات كاملة بحسب المدينة
- القاموس city_totals فيه إيراد كل مدينة بـ each_with_object
- المصفوفة ranking مرتّبة من الأعلى إيرادًا إلى الأدنى
- طُبع سطر لكل مدينة بترتيب ranking