はじめに

もっとブロック構文の使い方を知りたいですか?
ブロック構文はRubyの特徴的な構文なので、ぜひ活用したいものですよね。
前回は、配列の要素を順次処理するためにブロック構文を使いました。
他にも、ブロック構文には便利な使いみちがあります。ブロック構文に慣れるためにも、さまざまな方法で使ってみましょう。
この記事では、Ruby初心者の方向けに、便利なブロック構文の使い方について説明していきます。覚えておけば、いつかきっと役に立ちますよ。

ブロック構文のおさらい

はじめに、前回の最後に説明したブロック構文についておさらいしておきましょう。
ブロック構文の使い道はひとつではありませんが、例としてよく使う配列の”eachメソッド”を取り上げました。
例:

names = ["Taro", "Hanako", "Shigeru"]
names.each { |n| puts "Hello, " + n }

ブロック構文は、コードの塊(コードブロック)をメソッド(処理)に渡す方法です。
この”eachメソッド”のように、ブロック構文に変数(例では|n|)を持つ場合もあります。
”eachメソッド”の場合は、この変数に配列の各要素が割り当てられます。
そして、要素の数だけコードブロック中の処理が繰り返されるというわけです。
また、先ほどの例は次のような構文でも書くことができます。
例:

names.each do |n|
puts "Hello, " + n
end

どちらの構文も使えるようにしておいて下さい。それでは、ブロック構文の他の使い道をみてみましょう。

timesメソッド、uptoメソッド、downtoメソッド

まずは、「timesメソッド」からです。次の例をみて下さい。
例:

10.times do |n|
puts n * 10
end

“timesメソッド”は、指定の数値になるまで処理を繰り返します。
ブロック構文の変数には、0から指定の数値-1までが順次渡されます。
結果からも分かる通り、最後の数字は含まれないことに注意しましょう。一般的に数値リテラルから直接呼び出されることが多いでしょう。
似たようなものに、「uptoメソッド」と「downtoメソッド」があります。次の例をみて下さい。
例:

5.upto(10) do |n|
puts n
end
5.downto(0) do |n|
puts n
end

“uptoメソッド”と”downtoメソッド”は、ともに指定の数値から引数で渡された数値(カッコ内の数値)まで順次処理します。
違いは、”uptoメソッド”は数値がプラス方向に、”downtoメソッド”は数値がマイナス方向に進むことです。
引数として渡した数値も含まれるので、直感的に使えます。

Rangeクラス

次に、類似の話題としてRangeクラスを紹介します。
クラスについては次回の連載で詳しく説明しますので、ここでは使い方を覚えておきましょう。
Rangeクラスは、数値や文字などの「範囲」を表すクラスです。
次のように、数値や文字の範囲を直感的に表現することができます。
例:

(1..10).each do |n|
puts n
end
("A".."Z").each do |s|
puts s
end

数値や文字の範囲を表したいときは、こちらのほうが優れているでしょう。

Hashクラス

以前の連載で、ハッシュについて説明しました。
ハッシュもコレクションのひとつなので、”eachメソッド”を使って要素を順次処理することができます。
配列と違うのは、ハッシュが「キーと値」を持っているということです。
そのため、次のようにブロック構文に2つの変数を持たせてやる必要があります。
例:

student = {
"name" => "Taro",
"age" => 17,
"sex" => "Male"
}
student.each do |k, v|
puts "#{k}:#{v}"
end

ハッシュの”eachメソッド”では、ブロック構文の変数にキーと値がそれぞれ渡されます。
後はそれを使って、コードブロック中で処理をすればOKです。
ここでは、キーと値を単一の文字列で出力しています。
Rubyでは、文字列中に「#{変数(または式)}」と記述すると、文字列中に変数をそのまま埋め込むことができます。
数値であっても自動的に文字列に変換してくれるため、この例も問題なく動作します。

まとめ

ここまで、いろいろなブロック構文の使い方を見てきました。
ブロック構文ひとつとってみても、実にさまざまな使いみちがあります。
Rubyでは頻繁にブロック構文を利用しますので、しっかりマスターしておきましょう。
特に、配列などのコレクションの要素の順次処理ではお世話になります。
それぞれのクラスのメソッドを覚えておきましょう。