0Pricing
Ruby Academy · درس

reduce وeach_with_object

تجميع المجموعات

reduce وeach_with_object درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ما هو reduce؟

يجمع reduce، وهو اسم مستعار لـinject، جميع العناصر في قيمة واحدة. وتتلقى الكتلة قيمة تراكمية والعنصر الحالي.

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

آلية عمل القيمة التراكمية

تحمل القيمة التراكمية النتيجة المتراكمة بين التكرارات. وأي قيمة تعيدها الكتلة تصبح القيمة التراكمية التالية.

[1, 2, 3].reduce(0) do |acc, n|
  puts "acc=#{acc} n=#{n}"
  acc + n
end

reduce دون قيمة ابتدائية

من دون قيمة ابتدائية، يصبح العنصر الأول هو القيمة التراكمية، ويبدأ التكرار من العنصر الثاني.

puts [10, 20, 30].reduce { |acc, n| acc + n }

reduce باستخدام Symbol

بالنسبة إلى المعاملات البسيطة، مرّروا Symbol مثل :+ أو :* بدلًا من كتلة.

puts [1, 2, 3, 4].reduce(:+)
puts [1, 2, 3, 4].reduce(:*)

العثور على أكبر قيمة

يمكن لـ reduce حساب أمور تتجاوز المجاميع، مثل العثور على أكبر قيمة.

nums = [3, 9, 2, 7]
max = nums.reduce { |acc, n| n > acc ? n : acc }
puts max

بناء سلسلة نصية

يمكن أن تكون القيمة التراكمية من أي نوع، بما في ذلك سلسلة نصية تبنونها تدريجيًا.

letters = ["r", "u", "b", "y"]
word = letters.reduce("") { |acc, c| acc + c.upcase }
puts word

ما هو each_with_object؟

يشبه each_with_object ‏reduce، لكنكم تمرّرون إليه كائنًا قابلًا للتغيير ويُعاد تلقائيًا. وتغيّرون الكائن داخل الكتلة.

result = [1, 2, 3].each_with_object([]) do |n, arr|
  arr << n * 2
end
puts result.inspect

بناء hash

يُعد each_with_object مثاليًا لبناء hash، لأنكم لا تحتاجون إلى إعادة الكائن في كل مرة.

words = ["apple", "pear"]
lengths = words.each_with_object({}) do |w, h|
  h[w] = w.length
end
puts lengths

عدّ مرات الظهور

اجمعوا بين hash ذات قيمة افتراضية وeach_with_object لإحصاء العناصر.

votes = ["a", "b", "a", "a"]
tally = votes.each_with_object(Hash.new(0)) do |v, h|
  h[v] += 1
end
puts tally

reduce مقارنةً بـ each_with_object

استخدموا reduce عندما تعيد كل خطوة قيمة جديدة، مثل المجاميع وحواصل الضرب. واستخدموا each_with_object عندما تعدّلون حاوية واحدة، مثل المصفوفات وhash.

puts [1, 2, 3].reduce(:+)
puts [1, 2, 3].each_with_object([]) { |n, a| a << n }.inspect

اختصار tally

لإجراء العد، تحتوي Ruby على أسلوب tally مضمّن يتولى المهمة نيابةً عنكم.

puts ["a", "b", "a"].tally

اختبار سريع

تحققوا من مهاراتكم في التجميع.

مراجعة

يمكنكم الآن تجميع المجموعات:

  • reduce/inject باستخدام قيمة تراكمية أو قيمة ابتدائية أو Symbol
  • each_with_object لبناء المصفوفات وhash
  • tally لإجراء عمليات العد بسرعة
  • اختيار reduce للقيم الجديدة، وeach_with_object للحاويات القابلة للتغيير

الدورة التالية: الأعداد والرياضيات.

puts (1..5).reduce(:*)

الأسئلة الشائعة

هل درس «reduce وeach_with_object» مجاني؟

نعم — نص درس «reduce وeach_with_object» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.

ماذا ستتعلم في «reduce وeach_with_object»؟

تجميع المجموعات تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟

لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «reduce وeach_with_object»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟

نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء النطاقات
  2. وحدة Enumerable
  3. map وselect وreject
  4. reduce وeach_with_object
← العودة إلى Ruby Academy