🪐

WhileとUntilの使い分け

2020/12/10に公開
3

こちら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の条件式では、inumより大きくなるまでループが続くと言うことになります。

i = 0
num = 3

until i > num  do
   puts i
   i +=1
end

iの値が4に達したときにループが止まるので出力は

0
1
2
3

となります。

どう使い分ける?

今回の問題では"i=num"の場合を含んでいなかったので出力が異なりましたが、
この点をuntilループの方に含んでしまえば全く同じ動作になります。

https://zenn.dev/swata_dev/articles/702e12b1485a3c

上の記事でも似たような内容を書きましたが、イングリッシュ非ネイティブとしてはどのような感覚でこの二つのループを使い分けるべきかがわかりません。

これについても調べてみると、同じ悩みをもつ方を見つけました!

質問には、Ruby歴15年のベテランWebディベロッパーさんからこのような回答が。

ルビーは同じ処理をいくつかの方法で実行できるようにデザインされている言語だから、基本的には自分にとってしっくりくる方、もしくは書いているコードによって使い分けるが良し。

何かが起きている間はこの処理をして欲しい!と言う場合はwhileを使う方がわかりやすいし、何かが完了した時にこの処理をやめて欲しい!と言う場合はuntilが直感的。

こんな雰囲気の内容をご教授いただきました!ありがとうございます。。

Summary Of The Day (SOTD)

以前の記事の"if not"と"unless"の違いに関しても、似たような結論に至りました。

しかしながら、"until"と"while"ループの場合は、条件式の中身が互いに排他的になっているので

使い分け方がわかりやすいと感じました。

英語の感覚が身に付けば、こういった使い分けも自然とできるようになりそう。。

Discussion

catnosecatnose

なるほど、引用されているuntilとwhileの違いはとても分かりやすいですね

AmetaAmeta

本当に同感でした!この方は他にもこのような些細な違いについて、わかりやすく説明されています。
ご参考までにリンクを添付しました!(Taryn Eastさん)