ما هو الـ Block؟
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 15 من 56.
لقد كنت تكتب الكتل بالفعل. في كل مرة كتبت فيها each do |x| ... end، كان الجزء الموجود بين do و end عبارة عن كتلة (block): وهي قطعة من الكود يتم تمريرها إلى طريقة (method).
[1, 2, 3].each do |n|
puts n * 2
endهنا، each هي method في المصفوفة، و do |n| ... end هو الـ block. تقوم each بتشغيل الـ block مرة واحدة لكل عنصر، وتمرره كـ n.
الكتل البرمجية (Blocks) ليست كائنات منفصلة تخزنها في متغيرات، بل هي مرتبطة مباشرة باستدعاء الطريقة (method call). فالطريقة إما أن تستقبل كتلة برمجية أو لا، ومعظم طرق التكرار (each، map، select، times) مصممة لاستقبال واحدة.
3.times do |i|
puts "hi #{i}"
endاستدعاء دالة (method) بدون الكتلة البرمجية (block) الخاصة بها يغير ما تفعله. فاستدعاء [1,2,3].map بدون كتلة برمجية يعيد مُعدِّدًا (enumerator) بدلاً من مصفوفة محولة، لذا فإن الكتلة البرمجية هي جزء من ما تعنيه الدالة.
التحدي
مبتدئاقرأ عددًا صحيحًا n من المدخلات. استخدم الطريقة times مع كتلة (block) لطباعة الرسالة Iteration <i> لكل قيمة من i من 0 حتى n - 1.
بالنسبة للمدخل 3، يكون المخرج:
Iteration 0
Iteration 1
Iteration 2ورقة مرجعية
الـ block هو عبارة عن كتلة من الكود يتم تمريرها إلى دالة (method) بين do |param| ... end:
[1, 2, 3].each do |n|
puts n * 2
endاستخدم times لتكرار كتلة برمجية n من المرات، مع انتقال i من 0 إلى n - 1:
3.times do |i|
puts "hi #{i}"
endجرّب بنفسك
n = gets.to_i
# TODO: استخدم n.times مع block لطباعة كل تكرار
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipeline