繰り返し(Rustの基本構文-8-)

#はじめに
Rustの基本的な文法についてまとめてみた。第8回。
今回からはプログラムの構文として、様々なことに使われる「__繰り返し__」について。
C/C++, python ,java, rubyなどでも多くに使われる。簡単にいうとloop文。
###目的
Rustにおける基本的な構文の理解をする。

#Rustの基本構文シリーズ
第3回⇒[Rustの基本構文(3)](https://qiita.com/jin237/items/59ef229a4de30cb8203b)　　URL：https://qiita.com/jin237/items/59ef229a4de30cb8203b
第4回⇒[Rustの基本構文(4)](https://qiita.com/jin237/items/42249f984746711be0e2)　　URL： https://qiita.com/jin237/items/42249f984746711be0e2
第5回⇒[Rustの基本構文(5)](https://qiita.com/jin237/items/3fc3341effb3670e5865)　　URL：https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒[Rustの基本構文(6)](https://qiita.com/jin237/items/903e33226f93e7a4e5a0)　　URL：https://qiita.com/jin237/items/903e33226f93e7a4e5a0
第7回⇒[Rustの基本構文(7)](https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d)　　URL：https://qiita.com/jin237/items/fcb5a05fb902dee1fc4d


#繰り返し


繰り返しを行わせる基本構文にはloop式、while式、while let式、for式の4つある。それぞれに対して簡単にコードを示しながら書いていく。
##導入
4つの基本的な繰り返しについてのリスト

```
基本となる構文

//loop式
loop{
    ループ本体
    break;
}

//while式
while 条件式{
　　ループ本体
}

//while let式
while let パターン = 変数{
    ループ本体
}

//for式
for 要素の名前 in イテレータ{
　　 ループ本体
}
```
上記4つのことについて説明していきます。

##loop式
上記のように基本構文は

```
loop{
    ループ本体
    break;
}
```
で表され、__loop式から抜けるためにはbreak式を使う。__
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.239 例3)

```rust
//例3
fn main(){
    let mut counter =0;

    loop {
        println!("{}", counter);
        if counter == 10{
            break counter;
        }
        counter += 1;
    };
}
```
結果

```terminal
[Running] cd "c:\Users\[username]\rust\project1\" && rustc loop_function.rs && "c:\Users\[username]\rust\project1\"loop_function
0
1
2
3
4
5
6
7
8
9
10

[Done] exited with code=0 in _.__ seconds
```
Cのようにな処理法と原理はやはり変わらない。(C/C++の代替なので。)変数を0と指定してから、それに対して1ずつ加算していく処理であるが、これはどの言語においても基礎中の基礎の処理であるので、根本の原理として覚えておいてもいいだろう。ここで、条件式の中に10まで達したらbreakとなっているので、その処理も正常に動いている。

##while式
```
while 条件式{
　　ループ本体
}
```
これについても、ほかの言語（主にC）と同じである。__while式を使うと、条件付きのループを作ることができる。__原理としては、ループ実行の前に条件式を実行してから、条件式の返す値がtrueの場合、ループ本体の実行をする。falseとなった場合にはループから抜けるために、loop式のようにbreakが必要ない。
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.240 例5)
例をloop式と同じ計算結果になるようにカウント数を11にする。

```rust
//例5　改編
fn main(){
    let mut counter = 0;

    while counter != 11{
        println!("{}", counter);
        counter += 1;
    };
}
```
結果

```
[Running] cd "c:\Users\[username]\rust\project1\" && rustc while_function.rs && "c:\Users\[username]\rust\project1\"while_function
0
1
2
3
4
5
6
7
8
9
10

[Done] exited with code=0 in _.__ seconds
}
```
このようにしてloop式とは違う書き方も可能となる。

#while let式

```
while let パターン = 変数{
    ループ本体
}
```
if letが存在していたようにwhile letも存在する。__while let式では、パターンマッチが行われ__、成功時にはループ本体の実行をする。失敗時には抜けて、次の式や文の実行に移る。

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.241 例6)

```rust
fn main(){
    let mut counter = Some(0);

    while let Some(i) = counter{
        if i == 11{
            counter = None;
        }else{
            println!("{}", i);
            counter = Some(i + 1);
        }
    }
}
```
この処理も結果は、loop式、while式と同様の結果となる。

#for式

```
for 要素の名前 in イテレータ{
　　 ループ本体
}
```

例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.241 例6)


```rust
fn main(){
    let vector = vec!["Cyan","Magenta","Yellow","Black"];

    for v in vector.iter(){
        println!("{}", v);
    }
}
```
結果

```terminal
[Running] cd "c:\[username]\fgdao\rust\project1\" && rustc for_function.rs && "c:\Users\[username]\rust\project1\"for_function
Cyan
Magenta
Yellow
Black

[Done] exited with code=0 in _.___ seconds
```
__ベクタのiter()関数はインテレータを返すので、これをinキーワードの後ろにおく__。というイメージでいい。
厳密にいうとinキーワードの後ろの値にはIntoIterator::into_iter()関数によってインテレータに変換されることから、inキーワードの後ろに書くべき値は「IntoIterator::into_iter()関数によってインテレータに変換される値」である。（わからなくていい。)
またbreak式を使うことはできるが値は帰らない。__while式でも同じだがその式(whileとfor)に返す値は常に()である。__

#さいごに
ざっとこの4つを使うことができれば繰り返しは十分だろう。本文では触れていなかったが、continue式というのも中で使えるので調べてみてほしい。本投稿では省略。次回は変数補足関数(rustでは__クロージャ__という)について触れてみようと思う。