الكلمة المفتاحية yield
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 17 من 56.
يمكن للأساليب (Methods) التي تعرفها بنفسك أن تأخذ كتلة (block)، تماماً مثل الأساليب المدمجة. داخل الأسلوب، تقوم الكلمة المفتاحية yield بتشغيل الكتلة التي مررها المستدعي.
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# Before block
# Hi from the block!
# After blockيمكنك تمرير الوسائط (arguments) إلى الكتلة (block) عن طريق إعطائها لـ yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30إذا قام تابع (method) باستدعاء yield ولكن المستدعي لم يمرر كتلة (block)، فإن Ruby تثير خطأً. تسمح لك block_given? بالتحقق أولاً:
def maybe
yield if block_given?
end
maybe # لا يحدث شيء
maybe { puts "called!" } # called!التحدي
سهلقم بتعريف طريقة (method) تسمى repeat تأخذ وسيطاً واحداً n (عدد صحيح) وتقوم بتمرير (yield) القيم 1, 2, ..., n إلى الكتلة البرمجية (block) الخاصة بها، واحدة تلو الأخرى.
بعد ذلك، قم باستدعاء الطريقة الخاصة بك مع n = 4 وكتلة برمجية تطبع "Got <value>" لكل قيمة يتم تمريرها.
المخرجات هي:
Got 1
Got 2
Got 3
Got 4ورقة مرجعية
استخدم yield داخل طريقة (method) لتشغيل الكتلة البرمجية (block) التي مررها المستدعي:
def greet
yield
end
greet { puts "Hi!" } # Hi!مرر الوسائط (arguments) إلى الكتلة البرمجية عبر yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([1, 2]) { |n| puts n }استخدم block_given? للتحقق مما إذا كانت هناك كتلة برمجية قد تم توفيرها قبل استدعاء yield:
def maybe
yield if block_given?
endجرّب بنفسك
# TODO: قم بتعريف `repeat` التي تمرر `1..n` إلى الـ block الخاص بها
# TODO: قم باستدعاء `repeat(4)` مع block يطبع "Got <value>"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
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