読者です 読者をやめる 読者になる 読者になる

【Ruby】繰り返し処理について(for, while, until, each, time, loop)

スポンサーリンク

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と似ていますが、もう一度同じ繰り返しを実行します。すなわち、配列の繰り返しであれば、もう一度同じ要素に対して処理を行うということです。正直あまり使う場面は無いかなと思います。

参考書籍

初学者におすすめです。

たのしいRuby 第4版
たのしいRuby 第4版
posted with amazlet at 15.05.22
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 6,842

たのしいRubyを読んだあとに。コンパクトで要点よくまとめられてます。

初めてのRuby
初めてのRuby
posted with amazlet at 15.05.22
Yugui
オライリージャパン
売り上げランキング: 16,113