はじめに
この記事は、Rubyにおける繰り返し処理について調べたものの忘備録です。初心者の書いたものですのでミスがあるかもしれませんが、その場合指摘していただけると助かります。
結論
Rubyに用意されている繰り返しに使われる制御構造とメソッドについて代表的なものをまず紹介します。
制御構造
- while
- until
- for
####メソッド
- each
- times
- upto
- downto
- loop
以下にその紹介と使い方を記します。
while
while "条件式" do #doは省略可能
"処理"
end
と記述し、条件式が真の値を取り続ける限りにおいて、処理を実行し続けます。
例えば、
num = 1
while num <= 3 do
puts "Hello World!"
num += 1
end
と記述すれば、numが3以下の間、Hello Worldと言う文字が表示されます。今回の処理には、numの値が1増えるよう記述しました。と言うことで、この処理は3回繰り返されます。
until
until "条件式" do #doは省略可能
"処理"
end
と記述し、条件式が偽の値を取り続ける限りにおいて、処理を実行し続けます。
例えば、
num = 1
while num > 3 do
puts "Hello World!"
num += 1
end
until文は条件式が偽の場合処理を実行する文なので、まずこの条件式について解説します。条件式は"num>3"。これはnumの値が3より大きいことを意味します。この条件が偽、つまり満たされない場合処理が実行されます。"3より大きい"が満たされない、すなわち、numが3以下の場合この処理は実行されます。
numが3以下の間、Hello Worldと言う文字が表示されます。while文の時と同様、処理が一度実行されるたびにnumの値が1増えるよう記述しましたので、今回の場合も処理は3回繰り返されます。
この例だとuntilのありがたみが薄いですが、whileで条件を表現するのが難しい時は、逆にuntilで条件を表示するのが容易である可能性があります。より分かりやすいコードになるようにwhileとuntilは使い分けるものだそうです。
for
for "変数" in "オブジェクト" do #doは省略可能
"処理"
end
と記述します。inの後ろには"範囲オブジェクト"が入ることがあります。これは値と値の間に".."または"..."と記されたもので、"先に書いた値から後に書いた値まで"を意味します。
例えば、
for i in 1..5 do
puts i
end
と言う処理を実行すれば、for文の動きを理解しやすいかと思います。このプログラムを実行すると、
>ruby for_example1
1
2
3
4
5
と言う表示がされます。この結果から、for文で用意したiと言う変数に1~5がそれぞれ代入されていることがわかります。
また、オブジェクトが配列などの場合もfor文を使うことができます。
countries = ["Japan", "USA", "Korean"]
for country in countries do
puts country
end
ここではfor文で配列をオブジェクトとして指定しました。以下に実行例を示します。
>ruby for_example2
Japan
USA
Koren
each
eachメソッドはfor文とよく似ています。for文をeachメソッドを使ったプログラムに直すのは容易です。以下にeachメソッドの汎用例と、for文で紹介した二つの例の書き換えを記します
"オブジェクト".each do |"変数"|
"処理"
end
(1..5).each do |i|
puts i
end
countries = ["Japan", "USA", "Korean"]
countries.each do |country|
puts country
end
このように、書き換えは容易です。for文はeachメソッドを人に分かりやすい字面にするために追加された特殊な構文だそうです。
###times
"繰り返したい回数".times do |"変数"|
"処理"
end
と記述します。繰り返したい回数だけ、処理を繰り返すメソッドです。
3.times do
puts "Hello World!"
end
と記述すれば、3回ほどHello World!と表示されます。
upto
"オブジェクト".upto(max) do |"変数"|
"処理"
end
オブジェクトを変数に代入し、処理を実行します。これを、値を1ずつ増加させながら繰り返し、オブジェクトの値がmaxになったら処理をやめます。繰り返しの例として、以下にuptoメソッドを使って"Hello World!"と3回表示させるようなプログラムを書きました。
1.upto(3) do
puts "Hello World!"
end
downto
"オブジェクト".downto(min) do |"変数"|
"処理"
end
オブジェクトのを変数に代入し、処理を実行します。これを、値を1ずつ減少させながら繰り返し、オブジェクトの値がminになったら処理をやめます。繰り返しの例として、以下にdowntoメソッドを使って"Hello World!"と3回表示させるようなプログラムを書きました。
3.downto(1) do
puts "Hello World!"
end
loop
終了条件がない繰り返しのメソッドです。
終了条件がないプログラムを実行してしまうのは問題があるので、繰り返しを制御する2つの命令を紹介します。
break #繰り返しを中断し、繰り返しから抜ける
next #次の回の繰り返しに移動する
この二つの命令をif文などと組み合わせて繰り返しを制御できます。
loopメソッドを使い、3回"Hello World!"と表示させる例を以下に示します。
i = 0
loop do
puts "Hello World!"
i += 1
if i == 3
break
end
end
感想、まとめ
メソッドの汎用例にある変数は使っても使わなくてもいいです。仮に使った場合、特に指定がなければ0から代入され、処理が繰り返すたびに値は1増加します。
無駄に長くなってしまった感があります。もっと端的に表現したい。