// dictionary
if式.
if式は、条件がtrueなら直後のブロックを、falseならelseのブロックを実行する分岐です。条件には論理値型の式を書きます(0など数値を条件にはできません)。分岐が3つ以上あるときはelse ifで条件をつなげます1。
Rustのifは文ではなく式であり、実行されたブロックの値がif式全体の値になります1。そのため三項演算子(cond ? a : b)は存在せず、評価結果をそのまま変数の束縛に使えます。
fn main() {
let temperature = 31;
let advice = if temperature >= 30 {
"猛暑です。水分補給を忘れずに"
} else if temperature >= 20 {
"過ごしやすい気温です"
} else {
"上着があると安心です"
};
println!("{advice}");
}Playgroundで開く値として使うときの規則
| 状況 | 規則 |
|---|---|
| 値を変数に束縛する | すべての分岐が同じ型の値を返す必要があります(型が食い違うとE0308) |
elseがない |
どのブロックも実行されない場合があるため、if式の値はユニット型()になります。()以外の値の束縛にはelseが必須です |
if let式
条件の代わりにletとパターンを書くif letは、パターンがマッチしたときだけブロックを実行する構文です1。Option型の中身を取り出すときの定番の書き方です。詳細はif let式を参照してください。
補足
elseなしで値を束縛できない(E0317)
elseのないif式の値はユニット型()なので、()以外の分岐の値を束縛しようとするとコンパイルエラーE0317になります2。
fn main() {
let stock = 5;
let message = if stock > 0 {
"在庫あり"
}; // エラー: E0317(elseがないと値を束縛できない)
println!("{message}");
}
let chains — 条件を&&で連結する
Rust 1.88(edition 2024限定)から、ifやwhile式の条件でletパターンと論理式を論理演算子&&で連結できます3。「Someを取り出せて、かつ条件も満たすとき」のような分岐が1行で書けます。
fn main() {
let point_balance: Option<u32> = Some(800);
if let Some(points) = point_balance && points >= 500 {
println!("{points}ポイントあるので500円引きクーポンと交換できます");
}
}Playgroundで開くFootnotes
この辞書が使われているページ
backlinks 4