Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. ブロック / yield / block_given?

ブロック / yield / block_given?

ブロックはメソッドに渡せる処理のかたまりです。『yield』でブロックを呼び出し、『block_given?』でブロックの有無を確認できます。

構文
# ブロック付きでメソッドを呼び出します(do...end 形式)。
メソッド名 do |引数|
  処理
end

# ブロック付きでメソッドを呼び出します({} 形式)。
メソッド名 { |引数| 処理 }

# メソッド定義内でブロックを呼び出します。
def メソッド名
  yield         # ブロックを実行します。
  yield(引数)   # 引数を渡してブロックを実行します。
end

# ブロックが渡されているか確認します。
def メソッド名
  if block_given?
    yield
  end
end
構文一覧
構文・メソッド概要
do...end複数行のブロックを定義します。優先順位が低いためメソッド引数との組み合わせで使われます。
{ }1行のブロックを定義します。優先順位が高く、インラインで書く際に使われます。
yieldメソッドに渡されたブロックを実行します。引数を渡すことができます。
block_given?メソッドにブロックが渡されているかどうかを真偽値で返します。
サンプルコード
# yield でブロックを呼び出すメソッドを定義します。
def 挨拶する
  puts "開始します。"
  yield  # ブロックを実行します。
  puts "終了しました。"
end

挨拶する do
  puts "こんにちは!"
end

# yield で引数を渡します。
def 二倍にして(数値)
  yield(数値 * 2)
end

二倍にして(5) { |n| puts "結果: #{n}" }  # 結果: 10

# block_given? でブロックの有無を確認します。
def オプション処理(値)
  if block_given?
    yield(値)
  else
    puts "ブロックなし: #{値}"
  end
end

オプション処理(42)               # ブロックなし: 42
オプション処理(42) { |n| puts "ブロックあり: #{n}" }  # ブロックあり: 42

# yield の戻り値を使います。
def 変換する(テキスト)
  結果 = yield(テキスト)
  puts "変換後: #{結果}"
end

変換する("hello") { |s| s.upcase }  # 変換後: HELLO
概要

ブロックはRubyの重要な機能で、メソッドに処理を後付けするための仕組みです。『each』や『map』などのイテレータもブロックを受け取るメソッドとして実装されています。

『do...end』と『{ }』はどちらもブロックを定義しますが、慣習として複数行は『do...end』、1行は『{ }』を使います。ブロックなしで『yield』を呼び出すと『LocalJumpError』が発生するため、ブロックが任意の場合は必ず『block_given?』で確認してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。