Rust:`@`(at符号)运算符是什么?

9

我在我的代码中看到了以下这行内容,但是我不确定它的作用,因为我以前没有遇到过@运算符。

if let e@Err(_) = changed {
    ...
}

这行代码是否可以不用@运算符来编写,那会是什么样子?

1
这基本上等同于 if changed.is_err() { let e = changed; ... } - undefined
3个回答

9
这是一种将模式匹配的值绑定到变量的方法(使用语法:variable @ subpattern)。例如:
let x = 2;

match x {
    e @ 1 ..= 5 => println!("got a range element {}", e),
    _ => println!("anything"),
}

那么,(A)if let Err(e) = changed和(B)if let e@Err(_) = changed有什么不同吗? - Thorkil Værge
2
@ThorkilVærge。@绑定了匹配值,假设changedResult类型,则e在第二种情况(B)中的类型是changed的类型。 - Abdul Niyas P M

3

2
回答你的第二个问题,是的,它会看起来像这样。
if let Err(_) = &changed {
    // continue to use `changed` like you would use `e`
}

请注意,在正文中继续使用changed,您需要匹配参考&changed。否则,它将被移动并丢弃(除非它恰好是Copy)。

1
我认为最后一句话不准确。if let Err(_) = changed永远不会移动changed,因为左侧没有目标可以移动到。(示例) - Sven Marnach
1
还要注意的是,惯用的写法是 if changed.is_err() - Sven Marnach
2
一个完全等价的(匹配移动和丢弃行为)代码是 if changed.is_err() { let e = changed; ...} - trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接