WhileとUntilの使い分け
こちらAmetaです。本日はRubyの繰り返し処理について調べてみました。
いきなりクイズ
Untilループ
i = 0
num = 3
until i > num do
puts i
i +=1
end
Whileループ
i = 0
num = 3
while i < num do
puts i
i +=1
end
上にあるのは二種類のループ処理の記述。
Q. さて、どちらのループが以下の出力結果が得られるでしょうか?
0
1
2
Answer
Whileループ
解説
まずは二つのループの違いを明確にします。
Untilの繰り返し処理
until
は、条件式の中身が"false"になるまで処理が続く。
until 条件式(false) do
#処理
end
Whileの繰り返し処理
while
は、条件式の中身が"true"の間だけ処理が続く。
while 条件式(true) do
#処理
end
Untilループの出力結果...
先ほどのuntil
の条件式では、i
がnum
より大きくなるまでループが続くと言うことになります。
i = 0
num = 3
until i > num do
puts i
i +=1
end
i
の値が4に達したときにループが止まるので出力は
0
1
2
3
となります。
どう使い分ける?
今回の問題では"
この点をuntilループの方に含んでしまえば全く同じ動作になります。
上の記事でも似たような内容を書きましたが、イングリッシュ非ネイティブとしてはどのような感覚でこの二つのループを使い分けるべきかがわかりません。
これについても調べてみると、同じ悩みをもつ方を見つけました!
質問には、Ruby歴15年のベテランWebディベロッパーさんからこのような回答が。
ルビーは同じ処理をいくつかの方法で実行できるようにデザインされている言語だから、基本的には自分にとってしっくりくる方、もしくは書いているコードによって使い分けるが良し。
何かが起きている間はこの処理をして欲しい!と言う場合は
while
を使う方がわかりやすいし、何かが完了した時にこの処理をやめて欲しい!と言う場合はuntil
が直感的。
こんな雰囲気の内容をご教授いただきました!ありがとうございます。。
Summary Of The Day (SOTD)
以前の記事の"if not"と"unless"の違いに関しても、似たような結論に至りました。
しかしながら、"until"と"while"ループの場合は、条件式の中身が互いに排他的になっているので
使い分け方がわかりやすいと感じました。
英語の感覚が身に付けば、こういった使い分けも自然とできるようになりそう。。
Discussion
なるほど、引用されているuntilとwhileの違いはとても分かりやすいですね
本当に同感でした!この方は他にもこのような些細な違いについて、わかりやすく説明されています。
ご参考までにリンクを添付しました!(Taryn Eastさん)
ありがとうございます!