【问题标题】:Why sometimes a variable is dereferenced in match?为什么有时一个变量在匹配中被取消引用?
【发布时间】:2020-10-15 23:42:02
【问题描述】:

在匹配表达式中看到一个变量被取消引用是很常见的。 Rust 的 libcore 在某些函数中使用了这个:

impl<T> Option<T> {
    pub fn is_some(&self) -> bool {
        match *self {
                Some(_) => true,
                None => false,
            }
        }
    }
}

什么时候应该使用它,什么时候不应该使用它?这有记忆或性能惩罚吗?

【问题讨论】:

  • 主要是风格问题。一旦通过优化器,对内存或性能没有影响。

标签: syntax rust pattern-matching


【解决方案1】:

匹配模式必须与表达式的类型相同。如果表达式是引用,则模式也必须与引用匹配。

在采用&amp;self(引用)的方法中,这个:

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

相当于:

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

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

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

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

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

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

【讨论】:

  • 为什么我们不应该在第二个示例中简单地写Some(_)None
  • @IsaacFerreira 您说的是“匹配人体工程学”,它允许编译器自动在模式中添加&amp;s 和refs 以使事情正常进行。它不是 100% 完美的,但你是对的,它适用于这种情况。然而,它是否使代码更好是一个见仁见智的问题。
  • ...抱歉,现在称为default binding mode 而不是“符合人体工程学”...可能很难跟上最新的。不管你怎么称呼它,当我和 PeterHall 学习 Rust 时,它都不存在 ;-)
  • @trentcl 真的!多年来,许多符合人体工程学的改进使代码更简单、更清晰,但也使准确解释事物的实际工作方式变得更加困难。例如,我一生的心智模型基本上仍然是词汇 - 但有一些我知道有效的特殊情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 2020-04-23
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多