1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyにおける繰り返し処理

Last updated at Posted at 2021-03-24

はじめに

この記事は、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_example1
for i in 1..5 do
  puts i
end

と言う処理を実行すれば、for文の動きを理解しやすいかと思います。このプログラムを実行すると、

>ruby for_example1
1
2
3
4
5

と言う表示がされます。この結果から、for文で用意したiと言う変数に1~5がそれぞれ代入されていることがわかります。

また、オブジェクトが配列などの場合もfor文を使うことができます。

for_example2
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増加します。
無駄に長くなってしまった感があります。もっと端的に表現したい。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?