为什么有时一个变量在match中被取消引用



在匹配表达式内取消引用变量是很常见的。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语句,然后在编译器抱怨时修复它。

最新更新