シンプルな条件分岐であればif
を使える
真偽値に応じて処理を分岐させたい場合はif
を使用します。TypeScriptと違い、条件は()
で囲みません。
他の言語と同様にelse
も使用できます。
fn main() {
let number = 7;
if number < 10 {
println!("Number is less than 10");
} else {
println!("Number is 10 or greater");
}
}
if
ブロックは値を返すことができる
if
ブロックは値を返すことができるので、いわゆる三項演算子(TypeScriptでいうconst a = b ? c + d;
のようなもの)は不要です。
fn main() {
let condition = true;
let number = if condition { 5 } else { 10 };
println!("The value of number is: {}", number);
}
if
ブロックの最後の式で値を返すことができるのは新鮮で、単純に便利だと思いました。三項演算子より直感的ですよね。
const condition = true;
const number = condition ? 5 : 10;
console.log(`The value of number is: ${number}`);
ある値に対してパターンマッチングしたい場合はmatch
を使う
いわゆる、TypeScriptでいうswitch
文に相当しますが、よくあるswitch
文とは若干記法が異なります(明示的なbreak
が不要)。
複数の値を一つのパターンにまとめる場合は|
で繋げます。評価対象が数値で、パターンとして範囲を指定したい場合はRange
構造体を使います。シンプルなやり方は..
を使う方法です。p..q
と書くと、p
以上q
未満を表現するRange
を作成できます。
どれにも当てはまらない場合は_
で受け取ります。
fn main() {
let number = 5;
match number {
1 => println!("One"),
2 | 3 | 5 => println!("Prime number"),
4..=10 => println!("Number is between 4 and 10"),
_ => println!("Other number"),
}
}
TypeScriptのswitch
文はcase:
とセットで使い、インデントで処理を分けるので、Rustのmatch
の記述量の少なさに驚きます。
上記の例と同等のTypeScriptのコードは以下のようになります。
const number = 5;
switch (number) {
case 1:
console.log("One");
break;
case 2:
case 3:
case 5:
console.log("Prime number");
break;
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
console.log("Number is between 4 and 10");
break;
default:
console.log("Other number");
}
``
if
と同様、match
も値を返すことができます。
fn main() {
let number = 3;
let message = match number {
1 => "One",
2 | 3 | 5 => "Prime number",
4..=10 => "Number is between 4 and 10",
_ => "Other number",
};
println!("{}", message);
}
match
は後日解説するEnum
やOption
を組み合わせることで強力な処理フローを実現します。
注意点として、Rustのmatch
は包括的(公式ドキュメントより)です。すなわち、比較対象がEnum
のように有限個の値を取る場合、そのすべてを拾えるようなパターンマッチングでなければコンパイラはエラーを出力します。もし特定のパターンだけ処理を実行し、それ以外は無視したい場合は、前述のように_
を利用しましょう。