Rust 表达式中的符号“@”是什么意思

what the sign "@" mean in Rust expression

我是 Rust 的新手,在学习标准库时,我在匹配示例中找到了表达式 Some(x @ 6..=10)x @ 6..=10 是什么意思?

这是模式匹配的一种形式,具体来说 @ bindings。在形式...

let y = Some(3);
if let Some(x @ 6..=10) = y {
    // ...
}

...变量y需要是一个Some(...)才能匹配,内部值如果在6到10范围内就会赋值给x(包括的)。在上面的例子中,if 块将不会被执行,因为当 y 解构为 Some(...) 时,内部值不符合模式,因此 x 符合不绑定。

语法 low ..= high 允许您匹配 lowhigh(含)范围内的所有数字。模式匹配表达式中的 @ 允许您将变量绑定到匹配值。下面是一个例子来说明它们的用途:

fn log_num(maybe_num: Option<i32>) {
    match maybe_num {
        None => println!("didn't get a number"),
        Some(x @ 0..=5) => println!("got number {} between 0-5", x),
        Some(y @ 6..=10) => println!("got number {} between 6-10", y),
        Some(z) => println!("got number {} larger than 10", z),
    }
}

fn main() {
    log_num(None);
    log_num(Some(3));
    log_num(Some(7));
    log_num(Some(15));
}

playground

something @ pattern 是一种进行模式匹配的方法。通常,匹配分支会为部分匹配值创建变量。但是 something @ pattern 创建一个变量 something 并将整个值移动或复制到其中。