【MacでRust入門】Rust日本語版チュートリアルの要点まとめ ~ 第8回 if式、loop、whileループ、forループ
目次
こんにちは。
最近流行りのRustを初めてみよう!ということでチュートリアルを読み始めました。
内容を忘れないように & チュートリアルがTL;DRな方向けにブログ記事に要点をまとめていこうと思います。
前回はRustの関数についてまとめました。
今回は第8回です。Rustのif式とループについて要点をまとめます。
Rust のif式
if式は他の言語にもあるように、条件分岐を書く基本的な方法です。
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
if 条件式 {trueの場合に実行する式} else {falseの場合に実行する式}の形式で書く- 条件式はbool型でなければならない (自動でbool変換はされない)
else以降は省略可能で、その場合条件式がfalseだと処理が飛ばされて次のコードの処理に進む- 複数の条件を扱うときは
elseの代わりにelse if 条件式を使う。- 上から順番に評価して、最初に条件式が
trueになったときの処理が実行される (残りの条件式はチェックしない)
- 上から順番に評価して、最初に条件式が
- あまりに条件が多い場合は
if elseではなくmatchを使う
matchについては第4回でも少し触れましたが、後の記事でまとめる予定です。
Rustのif式を使い、条件分岐でlet変数を定義する
Rustのifは式であるため、let文の右辺で使えます。
let number = if x>3 { 5 } else { 6 };
xが3より大きいなら5, そうでないなら6といったような条件分岐で変数を定義することができます。
ただし、numberの型が複数取りうる形で書くとエラーになるので、if elseのどのブロックの結果も同じ型になるようにする必要があります。
Rustのループでの繰り返しを書く方法
最も基本的なループは以下のように書きます。無限ループになるので、xtrl + Cで止めましょう。
loop {
println!("Hello!");
}
loop{}で囲んだ中身が繰り返し実行されるbreakでループを終了するcontinueでループ内の残りの処理をスキップして、次のループ処理を始めるbreakとcontinueは最も内側のループに適用される- ループラベルを使って
breakとcontinueの適用するループを指定できる
breakとcontinueの実例は第4回の数あてゲームで使っています。
Rustのループラベルを使う方法
ループラベルの例は以下のようになります。
let mut count = 0;
'counting_up: loop {
println!("count = {}", count);
let mut remaining = 10;
loop {
println!("remaining = {}", remaining);
if remaining == 9 { break; }
if count == 2 { break 'counting_up; }
remaining -= 1;
}
count += 1;
}
println!("End count = {}", count);
counting_upというラベルがついたloopの中にもう一つのloopがあります。
if remaining==9は何もラベルがついていないので、最も内側のループを抜けます。if count==2は'coounting_upというラベルがついているので、外側のループを抜けます。
Rustのwhileで条件付きループ
loopではループ中に条件式とbreakなどを書いてループを終了させましたが、whileを使うと先にループする条件を定義できます。
以下はカウントダウンの例です。
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
println!("FIRE!!!");
出力
3!
2!
1!
FIRE!!!
条件式がtrueの間はループ処理が実行され続け、falseになったらループ終了します。他の言語でも同じような文法がありますね。
Rustのforループを使う方法
配列の各要素に対して処理を行いたい場合、whileでは条件式に要素数(配列の長さ)を指定する必要があるので、要素数が可変の場合、条件設定が複雑でミスる可能性があります。
そこでforループを使うことで各要素への処理を簡潔に書けます。これで要素数を数える必要がなくなります。
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {}", element);
}
カウントダウン動作もwhileよりforループを使ったほうが簡潔・安全に書くことができます。
for number in (1..4).rev() {
println!("{}!", number);
}
println!("FIRE!!!");
(開始..終了)のようにRange型を使うと、「開始〜終了未満」の範囲の配列を作れます- 配列の
revメソッドは範囲を逆順にします
動作はwhileの所で書いたコードと同じですが、かなり簡潔に書けました。
まとめ
というわけで、今回はRustの制御フローとしてif式、ループ、whileループ、forループをまとめました。
if 条件式 {trueのとき} else {falseのとき}で条件分岐loop{}でループ処理し、ループの中にさらにループ処理を書けるbreak、continueとループラベルを使うと指定した階層のループを抜けられるwhile 条件式{}より簡潔・安全に書けるforループで書くことを検討する
次回はRustの「所有権」という概念についてまとめていきます。
それでは〜
Rust オススメの参考書籍
▼ 入門者向け。Pythonとの比較あり。Kindleでも読める。
手を動かして考えればよくわかる 高効率言語 Rust 書きかた・作りかた
▼ 中級者向け。オライリーならではの詳解。硬派な方向け。
参考リンク
Rustチュートリアル (日本語版 非公式) https://doc.rust-jp.rs/book-ja/
