تُبرز أناقة روبي غالبًا من خلال طرق التكرار القوية. ومن أبرز هاتين الطريقتين، each
و collect
(المعروفة أيضًا باسم map
)، أساسيتان لمعالجة المجموعات. إن فهم نقاط قوتهما وكيفية دمجهما يحسّن بشكل كبير من كفاءة وقابلية قراءة شفرة روبي.
محتويات
- فهم طريقة
each
- استكشاف طريقة
collect
(map
) - دمج
each
وcollect
- تقنيات تكرار متقدمة
- خاتمة
- الأسئلة الشائعة
فهم طريقة each
طريقة each
هي حجر الزاوية في تكرار روبي. فهي تتكرر عبر كل عنصر في مصفوفة، أو جدول بيانات، أو أي كائن قابل للعد، وتنفذ كتلة من التعليمات البرمجية لكل عنصر. تُستخدم بشكل أساسي للآثار الجانبية — الإجراءات التي تُعدّل شيئًا ما خارج نطاق طريقة each
— فهي لا تُغيّر المجموعة الأصلية بشكلٍ جوهري.
numbers = [1, 2, 3, 4, 5]
numbers.each do |number|
puts number * 2 # يطبع كل رقم مضروبًا في 2
end
# الإخراج:
# 2
# 4
# 6
# 8
# 10
هنا، تتكرر each
، وتطبع الكتلة كل رقم مضاعف. تظل مصفوفة numbers
دون تغيير.
استكشاف طريقة collect
(map
)
على عكس each
، تُغيّر collect
(أو map
— هما اسمان مستعاران) المجموعة، حيث تُعيد مصفوفة جديدة تحتوي على نتائج تطبيق كتلة على كل عنصر. إنها مثالية لإنشاء مجموعات بيانات مُعدّلة.
numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.collect do |number|
number * number # تربيع كل رقم
end
puts squared_numbers # يطبع [1, 4, 9, 16, 25]
puts numbers # يطبع [1, 2, 3, 4, 5] - المصفوفة الأصلية لم تتغير
تُنشئ collect
مصفوفة squared_numbers
؛ وتبقى مصفوفة numbers
الأصلية دون تغيير.
دمج each
و collect
تُبرز قوة each
و collect
حقًا عند استخدامهما معًا. يمكنك الاستفادة من each
للآثار الجانبية بينما تُغيّر collect
البيانات.
numbers = [1, 2, 3, 4, 5]
squared_numbers = numbers.collect do |number|
puts "جاري المعالجة: #{number}" # تأثير جانبي
number * number
end
puts squared_numbers # يطبع [1, 4, 9, 16, 25]
هذا يجمع بين التحويل والتسجيل داخل كتلة collect
.
تقنيات تكرار متقدمة
بالإضافة إلى الاستخدام الأساسي، استكشف طرقًا مثل inject
/reduce
لمزيد من التجميعات والتحويلات المعقدة. هذه توفر نهجًا بديلة لمعالجة المجموعات، مما يوفر مرونة تتجاوز العمليات على كل عنصر.
خاتمة
each
و collect
أساسيتان لأي مطور روبي. إن فهم استخداماتهما، بشكل منفرد أو مجتمعة، يحسن بشكل كبير من وضوح الشفرة، وكفاءتها، وقابلية صيانتها. يعتمد الاختيار على ما إذا كنت بحاجة إلى تعديل المجموعة الأصلية أو ببساطة تنفيذ إجراءات على كل عنصر.
الأسئلة الشائعة
- س: ما هو الفرق بين
collect
وmap
؟ ج: هما اسمان مستعاران؛ متطابقان وظيفيًا. غالبًا ما يُفضلmap
لقابلية القراءة. - س: هل يمكن لـ
each
أن تُعيد قيمة؟ ج:each
تُعيد دائمًا المجموعة الأصلية. هدفها هو الآثار الجانبية. - س: هل يمكنني استخدام
each
مع الجداول؟ ج: نعم.my_hash.each { |key, value| puts "#{key}: #{value}" }
- س: هل هناك بدائل لـ
collect
؟ ج: نعم،inject
/reduce
، لكنcollect
/map
تظل أبسط طريقة للتحويلات على كل عنصر.