Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Reduce / Inject

جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 23 من 56.

أحيانًا تحتاج إلى تقليص مصفوفة كاملة إلى قيمة واحدة، مثل مجموع، أو حاصل ضرب، أو أطول سلسلة نصية. تُعد reduce (تُسمى أيضًا inject: نفس الطريقة، اسمان مختلفان) هي الأداة المناسبة.

يأخذ المقطع (block) معاملين: المجمع (accumulator) والعنصر الحالي. وتصبح القيمة المرجعة للمقطع هي المجمع التالي.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total   # 10

خطوة بخطوة، المجمع (accumulator) هو 0 → 1 → 3 → 6 → 10.

المعامل الأول هو القيمة الابتدائية للمراكم (accumulator). إذا تركته، ستستخدم Ruby العنصر الأول من المصفوفة:

[1, 2, 3, 4].reduce { |acc, n| acc * n }   # 24

بالنسبة للعمليات البسيطة مثل المجموع والضرب، توفر لك Ruby اختصاراً، وهو تمرير رمز (symbol) بدلاً من كتلة برمجية (block):

[1, 2, 3, 4].reduce(:+)   # 10
[1, 2, 3, 4].reduce(:*)   # 24

بمجرد أن تتمكن من بناء مجمع مخصص (accumulator)، يمكنك حساب أي شيء تقريبًا في تمريرة واحدة.

challenge icon

التحدي

سهل

اقرأ قائمة من الأعداد الصحيحة المفصولة بفاصلة. اطبع ثلاثة أسطر:

  1. المجموع (استخدم reduce(:+))
  2. حاصل الضرب (استخدم reduce(:*))
  3. الحد الأقصى، محسوبًا باستخدام reduce وكتلة برمجية (block) صريحة، وليس باستخدام max.

للمدخلات 2,5,3,8، المخرجات هي:

18
240
8

ورقة مرجعية

تقوم reduce (الاسم المستعار: inject) بتقليص المصفوفة إلى قيمة واحدة. تستقبل الكتلة (block) مجمعاً (accumulator) والعنصر الحالي؛ وتصبح قيمتها المرجعة هي المجمع التالي.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }  # 10

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

[1, 2, 3, 4].reduce { |acc, n| acc * n }  # 24

مرر رمزاً (symbol) كاختصار للعمليات البسيطة:

[1, 2, 3, 4].reduce(:+)  # 10
[1, 2, 3, 4].reduce(:*)  # 24

جرّب بنفسك

numbers = gets.chomp.split(",").map(&:to_i)

# مهام: طباعة المجموع، والناتج، والحد الأقصى (باستخدام reduce + كتلة برمجية صريحة)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق العمليات