導入
3.times do |i| ... end のように、メソッドに do..end の処理のかたまり(ブロック)を渡す書き方を今までにも使ってきました。実は自分で定義するメソッドにも、同じようにブロックを渡せます。
説明
メソッドの中で yield と書くと、そのメソッドに渡されたブロックが実行されます。
def repeat_twice
yield
yield
end
repeat_twice { puts "こんにちは" }
ブロックが渡されているかどうかは block_given? で調べられます。渡されていないのに yield を呼ぶとエラーになるので、確認してから呼ぶのが安全です。
def safe_call
if block_given?
yield
else
puts "ブロックがありません"
end
end
safe_call { puts "ブロック実行" }
safe_call
やってみよう
repeat_twice の呼び出し回数を増やしたり、yield を3回に増やしたりして挙動を確かめましょう。safe_call をブロックあり・なしの両方で呼んで違いを確認してください。
演習
with_border というメソッドを定義し、yield の前後に "---" を1行ずつ表示してください。with_border { puts "中身" } を呼び出し、---・中身・--- の3行を表示してください。
ヒント1を見る
def with_border puts "---"; yield; puts "---" end のように書きます。
ヒント2を見る
yield の前後に puts "---" を置きます。