Rubyの繰り返し処理についてです。前回条件分岐について書きましたが、この2つは一番よく使うものだと思いますし、これが汚いとコードの可読性も悪くなるので、正確に理解して綺麗なコードを書けるようにしていかないといけないですね。
for文について
for文の基本的な構文は次のようになります。doは省略可能です。
for 変数 in オブジェクト do 繰り返す処理 end
オブジェクトはなんでも指定できるわけではありません。基本的には配列とかハッシュですね。次の例では配列からひとつずつ要素を取得して変数に渡しています。Javaでいう拡張for文のような感じです。また、変数はfor文の外からでも呼び出せます。
strs = ["a", "b", "c"] for str in strs puts str end #=>a # b # c
ハッシュを使う場合は変数をカンマ区切りで2つ指定してあげます。
fruits = {:apple => "アップル", :orange => "オレンジ", :grape => "グレープ"} for key, value in fruits puts "KEY:#{key} VALUE:#{value}" end #=>KEY:apple VALUE:アップル # KEY:orange VALUE:オレンジ # KEY:grape VALUE:グレープ
変数を1づつカウントアップして使いたいような時は範囲オブジェクトを使用してください。変数 i を1から10まで増やして繰り返し処理をしてくれます。
for i in 1..10 ...処理文 end
while文について
while文の基本的な構文は次のようになります。doは省略可能です。
while 条件 do 繰り返す処理 end
処理は条件が成り立っている間、繰り返し実行されます。成り立っている間というのは条件判断の結果が真の間のみです。
結果 | 条件 |
---|---|
真 | true と nil 以外のオブジェクト全て |
偽 | false と nil |
という事は、次のような使い方の場合は問題ないですが
while i < 3 ... end
次のようなパターンは無限ループになってしまいます。
while true ... end while "hoge" ... end
until文について
until文の基本的な構文は次のようになります。doは省略可能です。
until 条件 do 繰り返す処理 end
while文と違い条件判断の結果が偽の間のみ、繰り返し実行します。if文とunless文の関係と同じです。
ここまではRubyの制御構造である繰り返し処理でしたが、以下はクラスに実装されている繰り返しメソッドになります。
eachメソッド
eachメソッドの基本的な構文は次のようになります。doは省略できません。
オブジェクト.each do |変数| 繰り返す処理 end
最初に紹介したfor文はRubyの内部処理として eachメソッドを実行しています。ですので、eachメソッドを呼び出す事ができるオブジェクトであれば、for文のinのあとにオブジェクトとして指定することができます。
また、for文との違いとして each メソッドの変数はブロックスコープ内(do〜end)で宣言されるため、ブロックの内側からしか呼び出せません。
timeメソッド
timeメソッドの基本的な構文は次のようになります。doは省略できません。
回数.times do 繰り返す処理 end
timeメソッドは単純に一定の回数だけ同じ処理をさせるという繰り返しです。次のように書くと繰り返している回数を変数として持つ事もできます。
5.times do |i| puts "#{i}回目" end #=>0回目 # 1回目 # 2回目 # 3回目 # 4回目
ただし、この結果を見てもわかる通り、変数に入ってくる値は 0 から始まりますので注意して下さい。1から使いたい場合は処理の中で +1 するしかありません。
uptoメソッド
uptoメソッドの基本的な構文は次のようになります。doは省略できません。
初期値.upto(最大値) do |i| 繰り返す処理 end
uptoメソッドはtimeメソッドと違い指定した初期値から最大値までを1ずつ増やしながら繰り返します。変数に入ってくる数値も1ずつカウントアップされます。初期値 > 最大値
の場合は何もされません。
1.upto(5) do |i| puts "#{i}回目" end #=>0回目 # 1回目 # 2回目 # 3回目 # 4回目
downtoメソッド
downtoメソッドの基本的な構文は次のようになります。doは省略できません。
初期値.downto(最小値) do |i| 繰り返す処理 end
downtoメソッドは指定した初期値から最初値まで数値を1ずつ減らしながら繰り返します。初期値 < 最小値
の場合は何もされません。
5.downto(1) do |i| putsh "#{i}回目" end #=>5回目 # 4回目 # 3回目 # 2回目 # 1回目
loopメソッド
loopメソッドの基本的な構文は次のようになります。doは省略できません。
loop do 繰り返す処理 end
これは終了条件のない繰り返しのためのメソッドです。無限ループになってしまうので、繰り返しを抜けるには break 文を使う必要があります。
do〜endについて
上記3つのメソッドについて、doは省略できませんと書きましたが、do〜endの代わりに「{ 〜 }」を使って書く事もできます。
オブジェクト.each { |変数|
繰り返す処理
}
繰り返しの制御
繰り返し処理の制御をするための命令が以下の3つです。
命令 | 用途 |
---|---|
break | 繰り返しを中断し、繰り返しの中から抜ける |
next | 次の繰り返しに処理を移す |
redo | 同じ条件で繰り返しをやり直す |
breakについて
breakはもっとも内側のループを抜けます。またbreak val
のように引数を指定すると戻り値を設定することができます。JavaやCのようにcaseを抜けるためには使いません。
nextについて
nextは繰り返し処理中のnext以降の処理を飛ばして、次の繰り返しに移ります。Javaでいうcontinueのようなものです。
redoについて
redoはnextと似ていますが、もう一度同じ繰り返しを実行します。すなわち、配列の繰り返しであれば、もう一度同じ要素に対して処理を行うということです。正直あまり使う場面は無いかなと思います。
参考書籍
初学者におすすめです。
ソフトバンククリエイティブ
売り上げランキング: 6,842
たのしいRubyを読んだあとに。コンパクトで要点よくまとめられてます。