0
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] whileにおける条件式の評価の挙動について

Last updated at Posted at 2020-07-04

はじめに

 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 == 5falseとなりif式の値はnilとなるのでループから抜けてしまっていたようです。

ちなみにRubyではnilfalse以外の全ての値が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 タイトルを内容に即したものに変更し、文章を少し校正しました。

備考

 普段はwhileloopは使わず、別の繰り返し用のメソッドを使っています。

0
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
0
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?