看到变量在match表达式中被取消引用是很常见的。Rustlibcore
在某些功能中使用了此功能:
impl<T> Option<T> {
pub fn is_some(&self) -> bool {
match *self {
Some(_) => true,
None => false,
}
}
}
}
我们什么时候应该使用它,什么时候不应该使用呢?这有记忆力或性能损失吗?
匹配模式必须与表达式具有相同的类型。如果表达式是引用,则模式还必须与引用匹配。
在采用&self
(参考)的方法中,这是:
match self {
&Some(_) => true,
&None => false,
}
等效于:
match *self {
Some(_) => true,
None => false,
}
没有性能差异;他们最终应该编译成相同的东西(证明)。
第二个样式被认为是更好的样式,因为它使用的字符更少,并且使图案的噪声和重复性更少。使用默认设置,如果您执行第一个,Clippy会警告您。
在很多情况下(包括此情况),您可以完全省略模式中的引用:
match self {
Some(_) => true,
None => false,
}
这是一种语法糖,其中&
s在明确的情况下会自动添加。我无法确切告诉您何时允许这样做,但是编译器当然会告诉您何时不允许这样做!;)在实践中,我倾向于编写match
没有显式引用的此类语句,然后在编译器抱怨时对其进行修复。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句