我这里有一个很小的playground example
fn main() {
let l = Some(3);
match &l {
None => {}
Some(_x) => {} // x is of type &i32
}
}
我正在&Option
上进行模式匹配,如果我将Some(x)
用作分支,为什么x
的类型为&i32
?
答案 0 :(得分:7)
您要匹配的表达式&l
的类型为&Option<i32>
,因此,如果严格要求,模式应为&None
和&Some(x)
,并且如果使用这些模式,x
的类型确实是i32
。如果我们像您在代码中那样在模式中省略了“&”号,则首先看起来这些模式根本无法匹配,并且编译器应抛出类似于“ expected Option,found reference”的错误,实际上这是Rust版本1.26之前编译器所做的。
Rust的当前版本支持RFC 2005引入的“匹配人体工程学”,并且现在允许将对枚举的引用与不带&符的模式进行匹配。通常,如果您的match表达式仅是引用,则不能将任何成员移出枚举,因此将引用与Some(x)
进行匹配等同于与模式&Some(ref x)
进行匹配,即{{ 1}}成为对x
内部值的引用。在您的特定情况下,内部值为Option
,即i32
,因此您将被允许与Copy
进行匹配并获得&Some(x)
,但这不是通用类型可能是这样。
RFC的思想是使正确的模式中的&符号和i32
变得更容易,但是我不完全相信新规则是否实际上简化了事情,或者它们是否增加了混乱通过在某些情况下使事物神奇地起作用,从而使人们更难以真正理解基本逻辑。