Reference 为什么在&;上进行模式匹配;选项<;T>;产生某种类型的东西(&;T)?
我这里有一个小房间Reference 为什么在&;上进行模式匹配;选项<;T>;产生某种类型的东西(&;T)?,reference,rust,optional,Reference,Rust,Optional,我这里有一个小房间 我在&Option上进行模式匹配,如果我使用Some(x)作为一个分支,为什么x是&i32类型?你匹配的表达式&l的类型是&Option,所以如果我们严格的话,模式应该是&None和&Some(x),如果我们使用这些模式,x的类型确实是i32。如果我们在模式中省略了符号,就像您在代码中所做的那样,首先看起来模式应该根本无法匹配,编译器应该抛出一个类似于“expected Option,found reference”的错误,事实上,这是在Rust版本1.26之前编译器所做的
我在
&Option
上进行模式匹配,如果我使用Some(x)
作为一个分支,为什么x
是&i32
类型?你匹配的表达式&l
的类型是&Option
,所以如果我们严格的话,模式应该是&None
和&Some(x)
,如果我们使用这些模式,x
的类型确实是i32
。如果我们在模式中省略了符号,就像您在代码中所做的那样,首先看起来模式应该根本无法匹配,编译器应该抛出一个类似于“expected Option,found reference”的错误,事实上,这是在Rust版本1.26之前编译器所做的
当前版本的Rust support“匹配人体工程学”由引入,现在允许将枚举引用与不带符号的模式匹配。通常,如果匹配表达式只是一个引用,则无法将任何成员移出枚举,因此将引用与Some(x)
匹配相当于与模式&Some(ref x)
匹配,即x
成为对选项的内部值的引用。在您的特定情况下,内部值是一个i32
,它是Copy
,因此允许您与&Some(x)
匹配并获得一个i32
,但这对于一般类型是不可能的
RFC的想法是使符号和参考号更容易正确地排列,但我不完全确信新规则是否真的简化了事情,或者在某些情况下,它们是否通过使事情神奇地工作而增加了混乱,从而使人们更难真正理解潜在的逻辑
fn main() {
let l = Some(3);
match &l {
None => {}
Some(_x) => {} // x is of type &i32
}
}