Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكلمة المفتاحية 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!
challenge icon

التحدي

سهل

قم بتعريف طريقة (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>"
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق العمليات