综合 Rust Ch.16.2 - 使用捕获和 const 表达式进行结构的模式匹配

ken*_*esu 1 pattern-matching rust

无法理解Google 综合 Rust 的模式匹配 - 解构结构中的第二个演讲者注释点。

\n

这是示例代码。

\n
struct Foo {\n    x: (u32, u32),\n    y: u32,\n}\n\n#[rustfmt::skip]\nfn main() {\n    let foo = Foo { x: (1, 2), y: 3 };\n    match foo {\n        Foo { x: (1, b), y } => println!("x.0 = 1, b = {b}, y = {y}"),\n        Foo { y: 2, x: i }   => println!("y = 2, x = {i:?}"),\n        Foo { y, .. }        => println!("y = {y}, other fields were ignored"),\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以及有问题的注释。

\n
\n

捕获和常量表达式之间的区别可能很难识别。尝试将第二个臂中的 2 更改为变量,然后发现它巧妙地不起作用。将其更改为常量并查看它再次工作。

\n
\n

认为我的英语很糟糕,但是当它说观察到它在进行更改时“巧妙地不起作用”时,它想表达什么?用类似的东西替换2in应该仍然可以编译吗?y: 2y: a

\n

Cha*_*man 5

这意味着做:

fn main() {
    let foo = Foo { x: (1, 2), y: 3 };
    let a = 2;
    match foo {
        Foo { x: (1, b), y } => println!("x.0 = 1, b = {b}, y = {y}"),
        Foo { y: a, x: i }   => println!("y = 2, x = {i:?}"),
        Foo { y, .. }        => println!("y = {y}, other fields were ignored"),
    }
}
Run Code Online (Sandbox Code Playgroud)

并期望它具有与 if yis 2 匹配的相同效果,但实际上它将匹配 anyy并捕获yin a(shadowing a = 2)。