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