Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ブロック / 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?』で確認してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。