التابع Enumerable.inject
في روبي
يجمع التابع inject
جميع عناصر الكائن القابل للتعداد الذي استدعي معه عبر تطبيق عملية ثنائية تُحدَّد بوساطة كتلة أو رمز يسمي تابعًا أو معاملًا.
التابعان inject
و reduce
هما وجهين لعملة واحدة؛ أي كل منها اسم بديل للآخر.
البنية العامة
inject(initial, sym) → obj
inject(sym) → obj
inject(initial) { |memo, obj| block } → obj
inject { |memo, obj| block } → obj
إن حُدَّدَت كتلة مع هذا التابع، فسيُمرَّر لكل عنصر من عناصر الكائن القابل للتعداد المعطى قيمة تراكمية (memo
) والعنصر نفسه. إن حُدَّدَ رمز عوضًا عن ذلك، فسيُمرَّر كل عنصر في المجموعة إلى التابع memo
المسمى. في كلا الحالتين، يصبح الناتج القيمة الجديدة من أجل memo
. في نهاية عملية التكرار، تكون القيمة memo
النهائية هي القيمة التي يعيدها التابع.
المعاملات
initial
قيمة بدائية يُبدَأ بها العملية. إن لم تُحدِّد القيمة initial
البدائية من أجل memo
صراحةً، فسيُستعمَل آنذاك العنصر الأول في المجموعة على أنَّه القيمة البدائية من أجل memo
.
sym
رمز يمثِّل اسم تابعٍ أو معاملٍ يراد استعماله لتنفيذ العملية الثنائية لجمع جميع عناصر الكائن القابل للتعداد المعطى.
القيمة المعادة
تعاد القيمة التراكمية النهائية الناتجة عن تجميع عناصر الكائن القابل للتعداد المعطى.
أمثلة
مثال على استعمال التابع inject
:
# جمع بعض الأعداد
(5..10).reduce(:+) #=> 45
# تنفيذ الوظيفة نفسها ولكن باستعمال كتلة
(5..10).inject { |sum, n| sum + n } #=> 45
# ضرب بعض الأعداد
(5..10).reduce(1, :*) #=> 151200
# أداء الأمر نفسه ولكن باستعمال كتلة
(5..10).inject(1) { |product, n| product * n } #=> 151200
# إيجاد أطول كلمة
longest = %w{ cat sheep bear }.inject do |memo, word|
memo.length > word.length ? memo : word
end
longest #=> "sheep"
انظر أيضًا
- التابع
chunk
: يُمرِّر كل عنصر من عناصر المجموعة التي استدعيت معه إلى الكتلة المعطاة ثمَّ يُقطِّعها إلى أجزاء (قطع صغيرة) بحسب القيمة المعادة من الكتلة.
- التابع
group_by
: يجمِّع عناصر الكائن القابل للتعداد الذي استدعي معه في مجموعات بحسب النتيجة المقابلة لكل عنصر التي تعيدها الكتلة المعطاة بعد تمريره إليها.