绑定

间接访问变量时,无法在分支中使用该变量而不重新绑定。match 提供了 @ 符号,用于将值绑定到名称:

// 一个返回 `u32` 的 `age` 函数。
fn age() -> u32 {
    15
}

fn main() {
    println!("告诉我你是什么类型的人");

    match age() {
        0             => println!("我还没有过第一个生日"),
        // 可以直接匹配 1 ..= 12,但那样无法知道具体年龄
        // 相反,我们将 1 ..= 12 的序列绑定到 `n`
        // 现在就可以报告具体年龄了
        n @ 1  ..= 12 => println!("我是 {:?} 岁的儿童", n),
        n @ 13 ..= 19 => println!("我是 {:?} 岁的青少年", n),
        // 没有绑定。直接返回结果。
        n             => println!("我是 {:?} 岁的老年人", n),
    }
}

你也可以使用绑定来"解构" enum 变体,例如 Option

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

fn main() {
    match some_number() {
        // 获得 `Some` 变体,检查其值(绑定到 `n`)是否等于 42
        Some(n @ 42) => println!("答案是:{}!", n),
        // 匹配任何其他数字
        Some(n)      => println!("不感兴趣... {}", n),
        // 匹配其他任何情况(`None` 变体)
        _            => (),
    }
}

另请参阅:

函数枚举Option