为什么&Option <t>上的模式匹配会产生Some(&T)类型的东西?

时间:2019-04-11 04:57:32

标签: reference rust optional

我这里有一个很小的playground example

fn main() {
    let l = Some(3);
    match &l {
        None => {}
        Some(_x) => {} // x is of type &i32
    }
}

我正在&Option上进行模式匹配,如果我将Some(x)用作分支,为什么x的类型为&i32

1 个答案:

答案 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变得更容易,但是我不完全相信新规则是否实际上简化了事情,或者它们是否增加了混乱通过在某些情况下使事物神奇地起作用,从而使人们更难以真正理解基本逻辑。