Rust - 文法 - ループ

クラウディア 
1. 概要
2. for
3. while, loop
4. break, contiue

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」はどう動くのかはよくわかっていません。  そのうち、くっきりわかったら記述します。
ハイスピードプラン