在 Rust 中,将非引用与引用进行模式匹配有何作用?

Max*_*ber 7 pattern-matching rust match-ergonomics

当对引用与不包含引用的模式进行模式匹配时会发生什么?

这是使用结构模式的示例:

fn main() {
    struct S(u32);
    let S(x) = &S(2);
    // type of x is `&u32`
}
Run Code Online (Sandbox Code Playgroud)

这种行为令我感到惊讶,因为左侧的模式似乎与右侧的数据匹配,这与s 排列的let &S(x) = &S(2)位置不同。&

看起来发生的情况是,当 RHS 是结构引用并且 lhs 是具有字段模式的结构模式时,字段模式中变量的类型就是&FwhereF是字段的类型。

我正在寻找的是:

  • 解释预期行为的参考
  • 对行为的解释足以解释除结构之外的元组和枚举所发生的情况。例如, let (x,) = &(2,);类型xi32(更正:) &i32

我在《Rust Reference》或《Rust Book》中找不到任何有关此内容的信息,但我可能错过了。

use*_*342 10

您遇到的行为是在 Rust 1.26 中通过“匹配人体工程学”引入的,并在其自己的 RFC中进行了描述。简而言之,当将引用与非引用模式进行匹配时,绑定模式会ref默认切换为使用绑定。

在你的情况下,let S(x) = &S(2)脱糖为let &S(ref x) = &S(2). Rust 书中ref很快就讨论了“遗留”状态。

对行为的解释足以解释除结构之外的元组和枚举所发生的情况。例如,在islet (x,) = &(2,);类型中。xi32

这是不正确的——如果你向 Rust 询问 的类型x,它会告诉你它是&i32,正如人们所期望的那样:

let (x,) = &(2i32,);
let () = x;
//       ^^   - this expression has type `&i32`
Run Code Online (Sandbox Code Playgroud)

换句话说,适用于结构和枚举的相同绑定模式规则也适用于元组。