ブロックは、メソッドに渡されるコードの塊で、{ }(1行)またはdo...end(複数行)で囲まれています。ブロックはRubyの特徴的で中核的な機能です — メソッドに動作を渡す方法であり、反復処理、コールバック、そしてRubyのエレガントで表現力豊かなスタイルを支えています。
ブロックの構文
[, , ].each { || puts n }
[, , ].each ||
doubled = n *
puts doubled
ブロックはメソッド(ここではeach)に渡され、各要素に対してそのブロックを呼び出します。|n|はブロックのパラメータ(渡される値)を宣言します。両方の構文は同等です。慣例では短いブロックに{ }を、長いブロックにdo...endを使用します。
[1, 2, 3, 4].map { |n| n * 2 } # [2, 4, 6, 8] — transform each
[1, 2, 3, 4].select { |n| n.even? } # [2, 4] — filter
[1, 2, 3, 4].reduce(0) { |sum, n| sum + n } # 10 — accumulate
3.times { |i| puts i } # 0, 1, 2
[1, 2, 3].each_with_index { |val, i| ... }
ブロックはRubyで反復処理とデータ変換を行う方法です — 「何をするか」をブロックとして渡し、メソッドが反復処理を処理します。これは明示的なループよりエレガントです。
# blocks elegantly handle setup/teardown — the file is auto-closed after the block
File.open("data.txt") do |file|
puts file.read
end # file automatically closed here, even if an error occurs
メソッドはセットアップ/クリーンアップパターン(ファイルが確実にクローズされるなど)にブロックを使用できます — メソッドがリソースを処理し、その間にあなたのブロックを呼び出します。
[1, 2, 3].map { |n| n.to_s } # full block
[1, 2, 3].map(&:to_s) # shorthand — &:method calls that method on each element
["a", "b"].map(&:upcase) # ["A", "B"]
&:method短縮形は、各要素に対して1つのメソッドを呼び出すだけのブロックを簡潔に書くイディオムです。
ブロックはRubyで最も特徴的で中核的な機能の1つです — Rubyがどのように動作するかの基本であり、その表現力豊かでエレガントなスタイルの根幹であるため、それらを理解することは、あらゆるRuby開発にとって不可欠です。
ブロックは、メソッドへの動作の受け渡し方法であり、これがRubyの特徴的なアプローチである反復処理とデータ変換を支えています。明示的なループを書く代わりに、各要素に対して何をするかを説明するブロック(map、select、reduce、each)を渡し、メソッドが反復処理を処理します — その結果、簡潔で読みやすい、関数型スタイルのコードが生まれ、それがまさにRubyらしいコードです。
ブロックはまた、エレガントなリソース管理パターン(メソッドがセットアップ/ティアダウン、例えばファイルの自動クローズを処理し、その間にあなたのブロックを呼び出す)も可能にします。
ブロック構文({ }対do...end)、ブロックがパラメータを受け取る方法(|n|)、Rubyで常に登場するEnumerableメソッドを支える方法、そして**&:method短縮形**のようなイディオムを理解することは、基礎的で必須の知識です — ブロックはRubyのイディオム的なコードの行ごとに登場します(すべての反復処理、変換、および多くのメソッド呼び出し)。
ブロックはRubyの設計と表現力豊かなスタイルの中核にあるため — そのエレガントな反復処理、コールバック、リソース管理パターンを可能にしています — ブロックをマスターすることはRubyを読み書きするために絶対に不可欠であり、明示的なループに依存する言語のアプローチとRubyを区別する定義的な機能です。そのため、言語を理解するための頻繁で重要なトピックとなっています。