Menu
Coddy logo textTech

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 block

yieldに引数を与えることで、ブロックに引数を渡すことができます:

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!
challenge icon

チャレンジ

簡単

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) を呼び出してください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン