محتويات الدورة
Ruby
الأساسيات: القيم والطرق والنص والكائنات الصالحة
العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم
التكامل: البيانات والموارد وأدلة التنفيذ والثقة

Ruby / العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم / الدرس 8

بناء مسارات Enumerable بتقييم مقصود

استخدم الاختيار والتحويل والتجميع والحساب والتكرار الكسول مع حفظ false وحدود العمل وملكية الآثار.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • ميّز التحويل المتحمس للمجموعة من معالجة Enumerator::Lazy الصريحة.
  • اختر التجميع والترشيح وفقا لمعنى البيانات لا لقصر الصياغة.

تعتمد Enumerable على عقد تكرار

توفر Enumerable عمليات عبر سلوك each للكائن. تهم القيم وعدد مرات التمرير؛ فقد ينتج مكرر مخصص أشكالا وآثارا غير متوقعة رغم تضمينه الوحدة. تقيّم map على Array مع كتلة بتلهف وتعيد مصفوفة، وقد تعيد دون كتلة Enumerator. تنشئ lazy مسارا آخر. لا تنقل افتراضات map من لغة أخرى بالاسم وحده. وضح الشروط والتحويل، ووثّق هل يكرر المرور عملا أو يرى مصدرا يتغير.

اجمع السجلات قبل تطبيق قاعدة مجموع واضحة

يجمع المثال سجلات ثابتة بالنوع ويحسب نسخها. تظهر fetch المفاتيح المطلوبة ولا تتحقق من النوع أو الإيجابية. يمنح فرز الأزواج النهائية ترتيبا حتميا للعرض بدلا من وصول المصدر. تحتفظ group_by بالعناصر فتستهلك ذاكرة، وليست مخفضا متدفقا لمصدر بلا حد. استخدم تجميعا مباشرا إذا لم يلزم حفظ السجلات كلها. المخرج محلل فقط لعدم توفر تنفيذ Ruby.

ruby ملخص أرشيف مجمع
records = [
  {kind: 'book', copies: 2},
  {kind: 'map', copies: 4},
  {kind: 'book', copies: 1}
]
totals = records.group_by { |record| record.fetch(:kind) }
  .transform_values { |group| group.sum { |record| record.fetch(:copies) } }
totals.sort.each { |kind, total| puts "#{kind}:#{total}" }
الناتج المتوقع
book:3
map:4

المخرج المتوقع book:3 ثم map:4. تُعالج المصفوفة كلها وتحتفظ بها المجموعات أثناء التجميع. لا يُتصل بمصدر أو قاعدة أو مفسر.

قد يحذف الترشيح قيما ذات معنى

تحفظ select ما يحقق الشرط، وتحول map كل عنصر، وتحتفظ filter_map بنتائج تحويل صحيحة شرطيا. أي إنها تحذف nil و false معا، لا الغياب فقط؛ فلا تناسب نتيجة false مشروعة يجب حفظها. تزيل compact قيمة nil من المصفوفة وتبقي false. اختر وفق عقد النتيجة وأظهر الرفض الجزئي إذا لزم ناتج لكل سجل. قد ينتج مسار مريح يفقد سجلات مطلوبة نجاحا مقنعا لكنه ناقص.

يغير الكسل وقت العمل ومقداره

تؤجل Enumerator::Lazy المعالجة حتى يطلب مستهلك قيما. تستطيع take الوقوف بعد كفاية المطابق بدلا من معالجة الكل. يكشف العداد ذلك بمجال محدود؛ وتعديله رصد تعليمي لا توصية بآثار خارجية داخل التحويل. قد يعيد الاستهلاك النداءات ويرى حالة ملتقطة تغيرت. ويحتاج المنتج اللانهائي مستهلكا منتهيا؛ فقد تحاول force أو to_a على مسار غير محدود عملا وذاكرة بلا نهاية.

ruby اختيار مؤجل بحد توقف مبكر
checked = 0
pipeline = (1..6).lazy.select do |number|
  checked += 1
  number.even?
end.take(2)
puts checked
puts pipeline.force.join(',')
puts checked
الناتج المتوقع
0
2,4
4

المخرج المتوقع 0 ثم 2,4 ثم 4. تُفحص القيم من 1 إلى 4 للحصول على زوجيتين. لم يُنفذ المصدر أو يقس أداؤه.

قِس العمل المعني ولا تفترض تفوق الكسل

قد تتجنب المسارات الكسولة مصفوفات وسيطة أو مرورا زائدا، لكنها تضيف كلفة ولا تجعل الفرز العام بلا ذاكرة. قد يكون المتحمس أوضح وأسرع للصغير. اختر حملا فعليا وقارن الصحة والتخصيص والزمن والأخطاء معزولا عند توفره. لا تعد مكررا كسولا يعتمد ملفا أغلقته الطريقة المنتجة. يظل عمر المصدر والإلغاء وتكرار الاستهلاك جزءا من العقد ولو بدت السلسلة عمليات صرفة.

الأخطاء الشائعة وإصلاحها

تختفي نتائج false من مجموعة محولة.

لماذا يحدث؟
احتفظت filter_map بالنتائج الصحيحة شرطيا فقط.
كيف تصلحه؟
استخدم map أو سياسة تحفظ false المطلوبة صراحة.
كيف تتجنب تكراره؟
اختبر nil و false منفصلتين في التحويل.

يبدو المسار الكسول بلا عمل.

لماذا يحدث؟
لم يطلب مستهلك قيمه.
كيف تصلحه؟
استهلكه بقصد أو اختر التحمس إذا لزم عمل فوري.
كيف تتجنب تكراره؟
أبعد الآثار عن النداءات المؤجلة لإظهار التوقيت.

يستنفد تجميع مدخل غير محدود الذاكرة.

لماذا يحدث؟
احتفظت group_by بكل العناصر المجمعة.
كيف تصلحه؟
حد المدخل أو استخدم تجميعا متدفقا مناسبا.
كيف تتجنب تكراره؟
راجع الحالة المحتفظ بها إلى جانب عدد المرور.

اختبر فهمك

1. أي عملية تزيل nil وتبقي false في مصفوفة؟

اعرض الحل المشروح

تتبع compact هذه القاعدة، بينما تحذف filter_map نتائج false و nil. تحقق من أن حذف nil سياسة المنتج؛ فقد يستحق حقل مطلوب أصبح nil رفضا لا حذفا صامتا. راجع دلالة العملية واكتمال البيانات معا.

2. لماذا قد تخطئ إعادة مكرر كسول من ملف بعد إغلاقه داخل كتلة؟

اعرض الحل المشروح

قد تؤخر القراءة حتى استهلاك المستدعي بعد انتهاء عمر الملف. استهلك داخل نطاق المالك أو صمّم مكررا يملك الاقتناء والإغلاق طوال المرور. لا تستنتج أمان المورد من الكسل أو عودة الطريقة دون استثناء.

أهم ما تعلمته

  • استراتيجية التقييم والحالة المحتفظ بها جزء من عقد التحويل.
  • يجب أن يحفظ الترشيح الفروق والاكتمال المطلوبين للمنتج.

المراجع الرسمية