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

Why sometimes a variable is dereferenced in 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,
}

没有性能差异;他们最终应该编译成同样的东西 (proof)。

第二个被认为是更好的风格,因为它使用更少的字符,并使模式不那么嘈杂和重复。使用默认设置,如果您执行第一个,Clippy 会警告您。

在很多情况下,包括这个,您可以完全省略模式中的引用:

match self {
    Some(_) => true,
    None => false,
}

这是一种语法糖,在明确的情况下会自动添加 &。我不能准确地告诉你什么时候允许,但是编译器肯定会告诉你什么时候不允许! ;) 在实践中,我倾向于这样写 match 语句,没有显式引用,然后在编译器抱怨时修复它。