在匹配表达式内取消引用变量是很常见的。Rust的libcore
在一些函数中使用了这个:
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
语句,然后在编译器抱怨时修复它。