はじめに

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

目的

Rustにおける基本的な構文の理解をする。

Rustの基本構文シリーズ

第3回⇒Rustの基本構文(3)  URL:https://qiita.com/jin237/items/59ef229a4de30cb8203b
第4回⇒Rustの基本構文(4)  URL: https://qiita.com/jin237/items/42249f984746711be0e2
第5回⇒Rustの基本構文(5)  URL:https://qiita.com/jin237/items/3fc3341effb3670e5865
第6回⇒Rustの基本構文(6)  URL:https://qiita.com/jin237/items/903e33226f93e7a4e5a0
第7回⇒Rustの基本構文(7)  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)

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

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

結果

[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にする。

//例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)

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)

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

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

結果

[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ではクロージャという)について触れてみようと思う。

广告
将在 10 秒后关闭
bannerAds