はじめに
この実験では、Rust におけるバインディングの概念を検討します。これにより、変数への間接的なアクセスと、再バインディングせずにその変数を分岐して使用する能力が可能になります。match 文の @ シグイルは、値を名前にバインドするために使用されます。具体的な範囲に値をバインドする方法や、Option のような enum のバリアントを「分解」する方法などの例が示されています。
注: 実験でファイル名が指定されていない場合、好きなファイル名を使用できます。たとえば、
main.rsを使用して、rustc main.rs &&./mainでコンパイルして実行できます。
バインディング
変数に間接的にアクセスすると、再バインディングせずにその変数を分岐して使用することができなくなります。match は値を名前にバインドするための @ シグイルを提供します。
// `u32` を返す関数 `age`。
fn age() -> u32 {
15
}
fn main() {
println!("Tell me what type of person you are");
match age() {
0 => println!("I haven't celebrated my first birthday yet"),
// 1..= 12 を直接 `match` することもできますが、その場合子供の年齢は何になりますか?代わりに、1..= 12 のシーケンスに対して `n` にバインドします。これで年齢を報告できます。
n @ 1 ..= 12 => println!("I'm a child of age {:?}", n),
n @ 13..= 19 => println!("I'm a teen of age {:?}", n),
// 何もバインドされていません。結果を返します。
n => println!("I'm an old person of age {:?}", n),
}
}
また、enum のバリアント(たとえば Option)を「分解」するためにバインディングを使用することもできます。
fn some_number() -> Option<u32> {
Some(42)
}
fn main() {
match some_number() {
// `Some` バリアントを取得し、その値が `n` にバインドされて 42 に等しい場合にマッチします。
Some(n @ 42) => println!("The Answer: {}!", n),
// その他の任意の数にマッチします。
Some(n) => println!("Not interesting... {}", n),
// その他の何か(`None` バリアント)にマッチします。
_ => (),
}
}
まとめ
おめでとうございます!あなたはバインディングの実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習することができます。