概要
Rustのif文は式 (expression) であり、値を返すことができる。
条件式は波括弧{}で囲まれたブロックで記述する。
条件式に括弧()を付ける必要はないが、条件式は必ずbool型でなければならない。
if式 / if-else式の条件分岐
条件式Aが成立するなら実行コードAが実行され、成立しないならば実行コードBが実行される。
if 条件式A {
実行コードA
}
else {
実行コードB
}
fn main() {
let hungry = true;
if hungry {
println!("I want to eat something!");
}
else {
println!("I am full.");
}
}
// 出力
I want to eat something!
Rustのif式は値を返すことができるため、let文で変数に代入することができる。
fn main() {
let hungry = true;
let message = if hungry {
"I want to eat something!"
}
else {
"I am full."
};
println!("{}", message);
}
// 出力
I want to eat something!
else if式を使用した条件分岐
条件式Aが成立すれば実行コードA、成立していなければ条件式Bが検証され成立していれば実行コードB、いずれの条件も成立していなければ実行コードCが実行される。
検証したい条件が更に必要であれば、else if式を必要な分だけ記述する。
Rustにはswitch文の代わりにmatch式という強力なパターンマッチング機能がある。
複数の値を比較する場合は、match式の使用を推奨する。
if 条件式A {
実行コードA
}
else if 条件式B {
実行コードB
}
else {
実行コードC
}
fn main() {
let code = "Swift";
if code == "Python" {
println!("I want to learn Django!");
}
else if code == "PHP" {
println!("I want to learn WordPress!");
}
else if code == "Swift" {
println!("I want to learn how to make iPhone apps.");
}
else {
println!("I'm going out for a walk.");
}
}
// 出力
I want to learn how to make iPhone apps.
match式を使用した条件分岐
Rustでは、switch文の代わりに match 式を使用する。
match式は、全てのパターンを網羅する必要がある。
全てのパターンを列挙しない場合は、ワイルドカードパターン(_ : C/C++のdefault)を使用する。
fn main() {
let code = "Swift";
match code {
"Python" => println!("I want to learn Django!"),
"PHP" => println!("I want to learn WordPress!"),
"Swift" => println!("I want to learn how to make iPhone apps."),
_ => println!("I'm going out for a walk."),
}
}
// 出力
I want to learn how to make iPhone apps.
match式も値を返すことができる。
fn main() {
let code = "Swift";
let message = match code {
"Python" => "I want to learn Django!",
"PHP" => "I want to learn WordPress!",
"Swift" => "I want to learn how to make iPhone apps.",
_ => "I'm going out for a walk.",
};
println!("{}", message);
}
// 出力
I want to learn how to make iPhone apps.
複数のパターンを同時にマッチさせる場合は、| 演算子を使用する。
fn main() {
let code = "Python";
match code {
"Python" | "Ruby" => println!("Script language!"),
"C" | "C++" | "Rust" => println!("Systems programming language!"),
_ => println!("Other language!"),
}
}
// 出力
Script language!
範囲を使用したパターンマッチも可能である。
fn main() {
let number = 13;
match number {
1..=10 => println!("1から10の範囲内"),
11..=20 => println!("11から20の範囲内"),
_ => println!("範囲外"),
}
}
// 出力
11から20の範囲内
if文の入れ子構造
条件の変数を2つ用意(複数条件)して、if式を入れ子構造で記述することができる。
Rustでは波括弧{}でブロックが明確に定義されているため、インデントは任意だが、可読性のために適切にインデントすることが推奨される。
fn main() {
let code = "Swift";
if code == "Python" {
println!("I want to learn Django!");
}
else {
if code == "PHP" {
println!("I want to learn WordPress!");
}
else {
if code == "Swift" {
println!("I want to learn how to make iPhone apps.");
}
else {
println!("I'm going out for a walk.");
}
}
}
}
// 出力
I want to learn how to make iPhone apps.
ただし、入れ子構造が深くなる場合は、else if式を使用した方が可読性が高い。
fn main() {
let code = "Swift";
if code == "Python" {
println!("I want to learn Django!");
}
else if code == "PHP" {
println!("I want to learn WordPress!");
}
else if code == "Swift" {
println!("I want to learn how to make iPhone apps.");
}
else {
println!("I'm going out for a walk.");
}
}
// 出力
I want to learn how to make iPhone apps.
論理演算子を使用した複数条件
複数の条件を組み合わせる場合は、論理演算子を使用する。
- &&
- AND演算子 (両方の条件が真の場合に真)
- ||
- OR演算子 (いずれかの条件が真の場合に真)
- !
- NOT演算子 (条件を反転)
fn main() {
let hungry = true;
let has_money = true;
if hungry && has_money {
println!("レストランに行きましょう!");
}
else if hungry && !has_money {
println!("家で食事をしましょう。");
}
else {
println!("まだ食事の時間ではありません。");
}
}
// 出力
レストランに行きましょう!
fn main() {
let age = 20;
let has_license = true;
if age >= 18 || has_license {
println!("運転できます。");
}
else {
println!("運転できません。");
}
}
// 出力
運転できます。
if let式による簡潔なパターンマッチ
Option型やResult型などの値を扱う場合、if let 式を使用すると簡潔に記述できる。
fn main() {
let some_value: Option<i32> = Some(10);
if let Some(x) = some_value {
println!("値は{}です", x);
}
else {
println!("値はありません");
}
}
// 出力
値は10です
これは、以下に示すmatch式と同等である。
fn main() {
let some_value: Option<i32> = Some(10);
match some_value {
Some(x) => println!("値は{}です", x),
None => println!("値はありません"),
}
}
// 出力
値は10です