作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这里有一个小playground example
fn main() {
let l = Some(3);
match &l {
None => {}
Some(_x) => {} // x is of type &i32
}
}
&Option
上进行模式匹配,如果我将
Some(x)
用作分支,为什么
x
是
&i32
类型?
最佳答案
您要匹配的表达式&l
的类型为&Option<i32>
,因此,如果严格要求,模式应为&None
和&Some(x)
,如果我们使用这些模式,则x
的类型确实为i32
。如果我们像您在代码中那样在模式中省略了“&”号,则首先看起来这些模式根本无法匹配,并且编译器应引发类似于“expected Option,found reference”的错误,实际上这是Rust版本1.26之前编译器所做的。
当前版本的Rust支持RFC 2005引入的“匹配人体工程学”,并且现在允许在没有&符的情况下将对枚举的引用与模式进行匹配。通常,如果您的match表达式仅是引用,则不能将任何成员移出枚举,因此,将引用与Some(x)
进行匹配等同于与模式&Some(ref x)
进行匹配,即x
成为对内部值的引用。 Option
。在您的特定情况下,内部值为i32
,即Copy
,因此将允许您与&Some(x)
匹配并获得i32
,但是对于常规类型而言,这是不可能的。
RFC的思想是使正确的模式中的&符号和ref
变得更容易,但是我不完全相信新规则是否实际上简化了事情,或者它们是否通过使事情在某些情况下神奇地起作用而增加了困惑案例,从而使人们更难以真正理解底层的逻辑。
关于reference - 为什么&Option <T>上的模式匹配会产生Some(&T)类型的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61026166/
我是一名优秀的程序员,十分优秀!