while と loop なぜ二つあるのか 、while trueではだめなのか

while trueとloopの違いはあるが、現段階では理解することはあまり重要ではないとRustチュートリアルにはあるが、どのような違いがあるか?をここで解説する。

http://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/loops.html

無限ループが必要なとき

while true {

を使いたいかもしれないが、

loopを使ったほうが良いだろう

loop {

Rustのコントロールフロー解析では、この構文は常にループすることが分かっているので、while trueとは異なる扱いをするためだ。一般に、コンパイラに与える情報が多ければ多いほど、安全性とコード生成の面で有利になる。したがって、無限にループする予定がある場合は、常にloopを選択すべきだ。

上の説明だと、いまいち抽象的でよくわからないが、実際whileだとうまく動かないケースをみてみよう。

while は以下のコードで初期化エラーをはく。

let x;
while true { x ="hogehoge"; break; }
println!("{}", x);

while trueは必ず実行されるのでxは初期化されるが、コンパイラはwhile文内が一度は必ず実行されることを考慮して型推測をしてくれない。

一方loopを使うと

let x;
loop { x ="hogehoge"; break; }
println!("{}", x)

コンパイルすることができる。