やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのくりかえし文(loop)

 無限ループ文。

成果物

コード

fn main() {
//    loop { println!("無限ループ! 端末次第だがCtrl+Cキーで終了するだろう。"); }
    let mut count = 0;
    loop {
        println!("loop num {}.", count);
        count += 1;
        if 9 < count { break; }
    }
}

loop

 loopは無限ループさせるコード。おそらくbreak文を入れて使うことになる。

 C言語ならwhile(1) {}, for(;;) {}で実装していた。Rustならloop {}でOK。このほうが自然言語的で読みやすい。

インクリメント

 ちなみに、インクリメントcount++はできない。Rustではcount += 1とするしかない。

++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できない

 Scalaでも同様らしい。

Scala にインクリメント演算子、デクリメント演算子が無いのは、Ruby と同じ言語設計上の判断をしたから

 では、Rustにはなぜ実装されていないのか。おなじ? それともオブジェクトだけど基本的にイミュータブルであるべきだから? またはlet v = ++i;let v = i++;で実行順が違うためvの値に違いが出てバグになりやすいから?

 i++;単独でのみ実行できるようにして代入させないようにすれば……と思ったけど、そこまでして導入しても中途半端だし無駄に冗長になる。たかがi++;i+=1;にして1文字(スペース入れたら3文字)を節約するためだけに、そこまで構文解析を実装するのは費用対効果が低い?

実行

$ rustc main.rs
$ ./main
loop num 0.
loop num 1.
loop num 2.
loop num 3.
loop num 4.
loop num 5.
loop num 6.
loop num 7.
loop num 8.
loop num 9.

参考

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで