choco-ballの日記

勉強のアウトプットのためのブログ

Ruby(7) 構文を用いた繰り返し

今回は繰り返し処理、その中でも構文を用いた繰り返しについてです。
繰り返し処理とは指定した回数または、条件を満たすまで処理を継続し続けることです。
今回扱う繰り返し構文はwhile文、until文、for文の三種類です。

while文は条件式がtrueである限り繰り返しを継続します。

while 条件式
 実行内容
end

上記が基本的なwhile文の作り方です。
実際に使ってみましょう。

num = 0

while num < 10 # numが10より小さい場合に処理を継続
 num += 2 # numにnum + 2したものを再代入
 puts num
end

puts "条件を満たさなくなるため(条件がfalseになるため)処理が終了"

# 出力結果
# 2
# 4
# 6
# 8
# 10 
# 条件を満たさなくなるため(条件がfalseになるため)処理が終了


条件がtrueの場合に処理を継続するので、
条件式にtrueを入れた場合は無限ループになります。
また、上記例の処理内容を num -= 2 とした場合も条件から外れることがなくなるので
無限ループになります。
コンソールで試して無限ループになってしまったら慌てずにcontrol + c で処理を強制終了しましょう。

次はuntil文です。
こちらも基本的な記述の仕方はwhile文と変わりません。
ただ、whileとは逆で条件がfalseの間処理を継続します。
実際に例を見てみましょう。

num = 0

until num > 10 # numが10より大きくない場合に処理を継続(比較演算子を変更)
 num += 2 # numにnum + 2したものを再代入
 puts num
end

puts "条件を満たしたため(条件がtrueになるため)処理が終了"

# 出力結果
# 2
# 4
# 6
# 8
# 10
# 12 
# 条件を満たしたため(条件がtrueになるため)処理が終了


while文の例と変えたのは比較演算子と出力用の文字列だけです。
しかし数字の出力結果が異なっています。
これは条件を10より〜という記述にしている為です。
whileは10より小さい場合に継続、つまりは9以下なら継続ということです。
その為値が10になった時に条件を満たします。
一方untilでは10より大きくない場合としているので11以上にならない限り継続ということです。
その為10になった時点では11以上という条件式から外れるための条件を満たせないので
12まで出力されています。
両方の例でwhileとuntilの記述だけ入れ替えた場合はどうでしょうか?
そもそもループ脱出条件を既に満たしているのでループに入ることはありません。

では最後にfor文を。

for 変数 in オブジェクト
 処理
end

上記がfor文の基本形となります。
オブジェクトから取り出したものを順番に変数に入れて処理をしていきます。

for num in 1..5
  puts num
end

# 出力結果
# 1
# 2
# 3
# 4
# 5


1..5という記述は範囲オブジェクトというものです。
数字の1~5までをオブジェクト(一つのモノ)として扱いますよということです。
処理の流れとしては
1~5までの値を順番に変数であるnumに入れてputsメソッドで出力しています。
もっと具体的な使い方にしてみましょう。

ary = ["スギ","ヒノキ","イネ"]

for allergies in ary
  puts "今年は#{allergies}の花粉がやばい"
end

# 出力結果
# 今年はスギの花粉がやばい
# 今年はヒノキの花粉がやばい
# 今年はイネの花粉がやばい


オブジェクトの中身を一つずつ変数に入れて、その変数に対して処理を行う
といった具合ですね。
似たような処理を行うものにeachメソッドというものがありますが、それはまた次の機会に。