【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/