本文へスキップ
BecomeCoder

Rubyコース · 第5章 メソッド · レッスン24

ブロックを受け取る ― yieldとblock_given?

ブラウザで完結

導入

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 "---" を置きます。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。