while/until無限防止
Ruby基礎とwhile/until
Rubyで最も基本的な制御構造の一つに while と until があります。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
上記の例では、while が count < 5 という継続条件を評価し、until が value <= 0 という終了条件を評価しています。これらの条件は状態監視により動的に変化します。
条件ループの書き方
Rubyの条件ループはシンプルですが、書き方によって可読性が大きく変わります。以下に代表的なパターンを示します。
- while ループ:
while 条件…end - until ループ:
until 条件…end - do-while 風:
begin…end while 条件(Ruby 2.7以降で非推奨)
条件ループは「継続条件」と「終了条件」を明確に定義することで、無限ループ防止が容易になります。特に while では条件が最初に評価されるため、初期値の設定が重要です。
無限ループ防止のテクニック
無限ループはプログラムを停止させる大きな原因です。以下のポイントで防止しましょう。
- ループ内で必ず条件を変化させる変数を更新する。
- 条件式に
breakを組み込むことで、予期せぬ状態でも抜けられるようにする。 - ループ回数に上限を設ける
timesやuptoを活用する。 - 状態監視を行い、条件が変化しない場合は警告を出す。
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
このように、while と until を組み合わせ、継続条件と終了条件を明確に定義することで、Ruby基礎の条件ループを安全かつ効率的に実装できます。
コメント
コメントを投稿