LoginSignup
10
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-07

はじめに

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
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7