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

艾萨克·费雷拉

看到变量在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么模式匹配有时在 Agda 中是“必不可少的”?

来自分类Dev

为什么有时未定义此变量?

来自分类Dev

为什么有时在列中得到最后一个变量,而有时在列中得到所有不同的变量?

来自分类Dev

Ruby 中的实例变量;为什么我必须(有时)指定`self`?

来自分类Dev

为什么有时在BeginInvoke块中得到NullReferenceException?

来自分类Dev

为什么二进制文件上的grep -P有时匹配错误的字节?

来自分类Dev

在 Ruby on Rails 中,为什么有时在控制器中是复数有时是单数?

来自分类Dev

为什么有时无法扩展用户环境变量?

来自分类Dev

为什么有时变量分配在列表上不起作用

来自分类Dev

为什么有时需要在将对象作为参数传递之前创建变量

来自分类Dev

在htop的命令列中,有时显示完整路径,有时则不显示。为什么?

来自分类Dev

为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

来自分类Dev

在AVR中,为什么有时有时只取带符号的数字的二进制补码?

来自分类Dev

为什么获得图像宽度有时效果很好,但有时在Vue.js中却无法呢?

来自分类Dev

在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

来自分类Dev

为什么在 javascript 中执行导入时,有时会返回未定义的变量?

来自分类Dev

为什么有时在Javascript中,函数参数前会有美元符号($ arg)?

来自分类Dev

当我增加数组中引用的变量时,为什么我的PointF状况没有得到更新?

来自分类Dev

为什么我不能在Assembly中声明一个使用已取消引用的变量的值的变量?

来自分类Dev

为什么有时依赖项在pom.xml中不包含版本属性?

来自分类Dev

为什么.NET中的检查算术有时比速记更快?

来自分类Dev

为什么有时Rust会在泛型中的参数前放置::?

来自分类Dev

为什么有时在动作参数中需要传递lambda而不是其他时间?

来自分类Dev

为什么有时不必在Java中声明“新”对象?

来自分类Dev

为什么有时在注释块中定义Javascript函数?

来自分类Dev

为什么window.load中的jQuery代码有时可以工作?

来自分类Dev

为什么在熊猫数据框中应用有时并不比for循环快?

来自分类Dev

为什么有时在Python的交互式解释器中输出转义符?

来自分类Dev

为什么有时在PHP中无法使用此附加功能?

Related 相关文章

  1. 1

    为什么模式匹配有时在 Agda 中是“必不可少的”?

  2. 2

    为什么有时未定义此变量?

  3. 3

    为什么有时在列中得到最后一个变量,而有时在列中得到所有不同的变量?

  4. 4

    Ruby 中的实例变量;为什么我必须(有时)指定`self`?

  5. 5

    为什么有时在BeginInvoke块中得到NullReferenceException?

  6. 6

    为什么二进制文件上的grep -P有时匹配错误的字节?

  7. 7

    在 Ruby on Rails 中,为什么有时在控制器中是复数有时是单数?

  8. 8

    为什么有时无法扩展用户环境变量?

  9. 9

    为什么有时变量分配在列表上不起作用

  10. 10

    为什么有时需要在将对象作为参数传递之前创建变量

  11. 11

    在htop的命令列中,有时显示完整路径,有时则不显示。为什么?

  12. 12

    为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

  13. 13

    在AVR中,为什么有时有时只取带符号的数字的二进制补码?

  14. 14

    为什么获得图像宽度有时效果很好,但有时在Vue.js中却无法呢?

  15. 15

    在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

  16. 16

    为什么在 javascript 中执行导入时,有时会返回未定义的变量?

  17. 17

    为什么有时在Javascript中,函数参数前会有美元符号($ arg)?

  18. 18

    当我增加数组中引用的变量时,为什么我的PointF状况没有得到更新?

  19. 19

    为什么我不能在Assembly中声明一个使用已取消引用的变量的值的变量?

  20. 20

    为什么有时依赖项在pom.xml中不包含版本属性?

  21. 21

    为什么.NET中的检查算术有时比速记更快?

  22. 22

    为什么有时Rust会在泛型中的参数前放置::?

  23. 23

    为什么有时在动作参数中需要传递lambda而不是其他时间?

  24. 24

    为什么有时不必在Java中声明“新”对象?

  25. 25

    为什么有时在注释块中定义Javascript函数?

  26. 26

    为什么window.load中的jQuery代码有时可以工作?

  27. 27

    为什么在熊猫数据框中应用有时并不比for循环快?

  28. 28

    为什么有时在Python的交互式解释器中输出转义符?

  29. 29

    为什么有时在PHP中无法使用此附加功能?

热门标签

归档