束縛

変数を直接マッチさせないときは、分割代入なしで自分自身を参照 できません。matchは自分自身を束縛する@記号を提供しています。

// `age`関数は`u32`を返します
fn age() -> u32 {
    15
}

fn main() {
    println!("Tell me what type of person you are");  // あなたがどんな人かおしえて

    match age() {
        0             => println!("I'm not born yet I guess"),  // 多分私はまだ生まれていません。
        // 1 ..= 12にはマッチできますが、この子供の歳がわかりません。
        // 代わりに、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),  // 私は{:?}歳のティーン(訳注: 10代の若者)です。
        // マッチしなかった場合の処理
        n             => println!("I'm an old person of age {:?}", n),
    }
}

Optionのように、「分割代入」したenumの列挙子にも使えます。

fn some_number() -> Option<u32> {
    Some(42)
}

fn main() {
    match some_number() {
        // `Some`列挙子で、値が42に等しかったときに、マッチして
        // `n`に束縛する。
        Some(n @ 42) => println!("The Answer: {}!", n),  // 答え: {}!
        // 他の数値にマッチする。
        Some(n)      => println!("Not interesting... {}", n),  // 面白くない... {}
        // 他のもの(`None`列挙子)にマッチする。
        _            => (),
    }
}

こちらも参照: