スキップしてメイン コンテンツに移動

while/until無限防止

while/until無限防止

Ruby基礎とwhile/until

Rubyで最も基本的な制御構造の一つに whileuntil があります。while は「継続条件」が真である限りループを続け、until は「終了条件」が真になるまでループします。両者ともに end キーワードでブロックを閉じる点が共通です。

count = 0
while count < 5
  puts "count: #{count}"
  count += 1
end

# until 例
value = 10
until value <= 0
  puts "value: #{value}"
  value -= 2
end

上記の例では、whilecount < 5 という継続条件を評価し、untilvalue <= 0 という終了条件を評価しています。これらの条件は状態監視により動的に変化します。

条件ループの書き方

Rubyの条件ループはシンプルですが、書き方によって可読性が大きく変わります。以下に代表的なパターンを示します。

  • while ループwhile 条件end
  • until ループuntil 条件end
  • do-while 風beginend while 条件(Ruby 2.7以降で非推奨)

条件ループは「継続条件」と「終了条件」を明確に定義することで、無限ループ防止が容易になります。特に while では条件が最初に評価されるため、初期値の設定が重要です。

無限ループ防止のテクニック

無限ループはプログラムを停止させる大きな原因です。以下のポイントで防止しましょう。

  1. ループ内で必ず条件を変化させる変数を更新する。
  2. 条件式に break を組み込むことで、予期せぬ状態でも抜けられるようにする。
  3. ループ回数に上限を設ける timesupto を活用する。
  4. 状態監視を行い、条件が変化しない場合は警告を出す。
max_iterations = 1000
iterations = 0
while true
  # 何らかの処理
  break if iterations >= max_iterations
  iterations += 1
end

上記の例では、iterations が上限に達したら break でループを終了します。これにより無限ループを防げます。

状態監視と終了条件

状態監視はループの継続条件を動的に評価するために不可欠です。例えば、外部データの更新を待つ場合は以下のようにします。

while !data_ready?
  sleep(0.5)  # 0.5秒待機
end
puts "データが準備完了"

ここで data_ready? は状態監視関数で、データが準備できたら true を返します。until を使うと逆に「終了条件」を明示できます。

また、終了条件を複数組み合わせることで柔軟な制御が可能です。

while !finished? && !error?
  process_next
end

このように、whileuntil を組み合わせ、継続条件と終了条件を明確に定義することで、Ruby基礎の条件ループを安全かつ効率的に実装できます。

この記事はAIによって作成されました。

コメント