yield キーワード
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 17/56。
自分で定義するメソッドも、組み込みのメソッドと同じようにブロックを受け取ることができます。メソッド内では、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 blockyieldに引数を与えることで、ブロックに引数を渡すことができます:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30メソッドが yield を呼び出しているのに、呼び出し側がブロックを渡さなかった場合、Rubyはエラーを発生させます。block_given? を使うと、事前にチェックすることができます:
def maybe
yield if block_given?
end
maybe # 何も起こらない
maybe { puts "called!" } # called!チャレンジ
簡単1つの引数 n(整数)を取り、そのブロックに対して 1, 2, ..., n の値を1つずつ渡す(yieldする) repeat という名前のメソッドを定義してください。
次に、n = 4 を指定してメソッドを呼び出し、渡された各値に対して "Got <value>" と出力するブロックを渡してください。
出力結果は以下の通りです:
Got 1
Got 2
Got 3
Got 4チートシート
メソッド内で yield を使用すると、呼び出し元から渡されたブロックを実行できます:
def greet
yield
end
greet { puts "Hi!" } # Hi!yield を介してブロックに引数を渡すことができます:
def with_each(items)
items.each { |item| yield item }
end
with_each([1, 2]) { |n| puts n }yield を呼び出す前に、block_given? を使用してブロックが提供されているかどうかを確認できます:
def maybe
yield if block_given?
end自分で試してみよう
# TODO: ブロックに対して 1..n を生成する `repeat` を定義してください
# TODO: "Got <value>" を出力するブロックを渡して repeat(4) を呼び出してください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。