本文へスキップ
BecomeCoder

Rubyコース · 第6章 ブロックとイテレータ · レッスン25

ブロックの2つの書き方 ― do..endと{}

ブラウザで完結

導入

これまで eachmap に処理を渡すとき、do..end{ } の両方を見てきました。この2つは実は同じ「ブロック」というしくみで、書き方が違うだけです。使い分けのコツを整理しましょう。

説明

graph LR
  M["メソッド呼び出し"] -->|ブロックを渡す| B["do |x| ... end"]
  B -->|要素ごとに実行| R["結果"]
[1, 2, 3].each do |n|
  puts "do..end: #{n}"
end

[1, 2, 3].each { |n| puts "{}: #{n}" }

total = [1, 2, 3].map { |n| n * 10 }
puts total.inspect

Ruby の習慣では、複数行にわたる処理は do..end1行で済む短い処理は { } を使うことが多いです。どちらも動作は同じですが、{ } の方が結合力が強いため、map { ... }.select { ... } のようにメソッドチェーン(結果に続けてメソッドを呼ぶ)をするときは { } の方が意図通りに動きやすいという実用上の理由もあります。

やってみよう

同じ処理を do..end{ } の両方で書き直して、結果が同じになることを確認しましょう。

演習

配列 nums = [1, 2, 3]{ } を使った each で回し、それぞれの値を2倍して表示してください(246 の3行)。

ヒント1を見る

nums.each { |n| puts n * 2 } のように書きます。

ヒント2を見る

{ }|n| ... のあとに処理を続けて1行で書けます。

実際に動かしてみよう

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

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

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