はじめに
whileを使っていたときに初めての挙動に遭遇したのでメモしておきます。
環境
ruby: 2.7.1
現象
現象_A
a = 0
while
if a == 5
break
end
a += 1
end
puts a
# 実行結果: 0
現象_B
b = 0
while
b += 1
if b == 5
break
end
end
puts b
# 実行結果: 5
現象_C
c = 0
while c < 5 do
c += 1
end
puts c
# 実行結果: 5
現象_D
d = 0
loop do
if d == 5
break
end
d += 1
end
puts d
# 実行結果: 5
現象_E
e = 0
loop do
e += 1
if e == 5
break
end
end
puts e
# 実行結果: 5
想定していた結果としては、現象_Aでも5
が出力するものだと思っていました。
なぜこうなるのか
(@scivolaさんのコメントにより解決することができました。)
どうやら、while
の直後の式が条件式として評価されるようです。つまり、今回の現象_Aでは、
if a == 5
break
end
この箇所がwhile
の条件式として初回に評価され、当然a == 5
はfalse
となりif
式の値はnil
となるのでループから抜けてしまっていたようです。
ちなみにRubyではnil
とfalse
以外の全ての値がtrue
となります。
試しに以下のように条件式を与えてやるとループ内の処理が実行されました。
a = 0
while true do # doは省略可
if a == 5
break
end
a += 1
end
puts a
# 実行結果: 5
ループ内にある式が、実は条件式になっていたことが今回の落とし穴でした。
編集履歴
2020/07/04 17:11 コメントにて@scivolaさんから問題の原因を解説いただきましたので「なぜこうなるのか」を編集しました。
2020/07/04 17:31 タイトルを内容に即したものに変更し、文章を少し校正しました。
備考
普段はwhile
やloop
は使わず、別の繰り返し用のメソッドを使っています。