導入
これまで each や map に処理を渡すとき、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..end、1行で済む短い処理は { } を使うことが多いです。どちらも動作は同じですが、{ } の方が結合力が強いため、map { ... }.select { ... } のようにメソッドチェーン(結果に続けてメソッドを呼ぶ)をするときは { } の方が意図通りに動きやすいという実用上の理由もあります。
やってみよう
同じ処理を do..end と { } の両方で書き直して、結果が同じになることを確認しましょう。
演習
配列 nums = [1, 2, 3] を { } を使った each で回し、それぞれの値を2倍して表示してください(2、4、6 の3行)。
ヒント1を見る
nums.each { |n| puts n * 2 } のように書きます。
ヒント2を見る
{ } は |n| ... のあとに処理を続けて1行で書けます。