1. 概要
「Rust」のループには、「for」「while」のほかに「loop」というものがあるらしい。
「Haskell」には、ループ文が存在しないというので、愕然とするとともに、急にやる気が失せたのですが、とりあえず主なループがあるだけでもありがたい。
本ページは、下記のサイトを参考にさせていただきました。
「制御フロー - The Rust Programming Language 日本語版」
2. for
(ええい、これがわしは、一番なじみやすいんじゃ)
「C++」で下記のように各ソース。
#include <stdio.h>
int main(int argc, char* argv[])
{
for (int i=1; i<9; i++)
{
for (int j=1; j<9; j++)
{
printf("%2d ", (i+1)*(j+1));
}
printf("\n");
}
return 0;
}
これを「Rust」で書くと、こうなります。
fn main()
{
for i in 1 .. 9
{
for j in 1 .. 9
{
print!("{:>2} ", (i+1)*(j+1));
}
println!("");
}
}
どちらも実行するとまったく同じ
4 6 8 10 12 14 16 18
6 9 12 15 18 21 24 27
8 12 16 20 24 28 32 36
10 15 20 25 30 35 40 45
12 18 24 30 36 42 48 54
14 21 28 35 42 49 56 63
16 24 32 40 48 56 64 72
18 27 36 45 54 63 72 81
という出力結果が得られます。
ちなみに、3、5行目を最初
for i in (1 .. 9)
{
for j in (1 .. 9)
と書いておりましたらばビルドの際に
warning: unnecessary parentheses around `for` iterator expression
--> src/main.rs:3:11
|
3 | for i in (1 .. 9)
| ^ ^
|
= note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
|
3 - for i in (1 .. 9)
3 + for i in 1 .. 9
|
と言われちゃいました。
「親がいないなら、かっこつけるな」ちゅうことでしょうか。
「for」を降順で動作させる際に
for i in (1 .. 9).rev()
{
for j in (1 .. 9).rev()
と書きますが、このように、「()」が必要なとき以外は、極力つけるなということのようです(う~ん、慣れんなぁ)。
これは、別途書こうと思っていますが。
print!("{:>2} ", (i+1)*(j+1));
の第一引数の「"{:>2} "」の部分は、「{}」で以降の引数が順倍にはいってくるようでう。
「{0}」「{1}」のように何番目かを指定することも可能なようです。
「{}」内の「:」以降が書式で、「>2」は、右寄せ2桁ということらしいです。
この部分は、「[Rust] 文字列のフォーマット指定(println! / format!)」を参考にさせていただきました。
3. while, loop
条件つきでループさせるのが
while 条件
{
式
}
で、これを条件なしでループさせるのが
loop
{
式
}
ということのようで、今までの言語方式で
while true
{
式
}
と書いていたのは「loop」に置きかえるわけで、上記のようなソースをビルドすると
warning: denote infinite loops with `loop { ... }`
--> src/main.rs:3:5
|
3 | while true
| ^^^^^^^^^^ help: use `loop`
|
= note: `#[warn(while_true)]` on by default
てなワーニングが出力されます。
「『loop』使った方が、いいんじゃね?」ってことですね。
4. break, contiune
他の「C」系と同様、「break」「continue」を使用することで、ループから抜けたり、先頭へ戻ったりできます。
便利なのが多重ループ使用時に
'main_loop: loop
{
loop:
{
式
}
}
のように、ループに「ループラベル」ちゅうものを付けることで、下層のループ内で「break 'main_loop:」と書けば、一気に上位のループまで抜けることができるようです。
これは、いまんとこ試していないので、「while」や「for」で使えるのか、「coninue」はどう動くのかはよくわかっていません。
そのうち、くっきりわかったら記述します。