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
    }
}