符合人体工程学和图案

Zer*_*bot 14 rust match-ergonomics

考虑以下代码

fn main() {
    let s = (&&0,);
    let (x,) = s; // &&i32
    let (&y,) = s; // &i32
    let (&&z,) = s; // i32

    let t = &(&0,);
    let (x,) = t; // &&i32
    let (&y,) = t; // i32

    let u = &&(0,);
    let (x,) = u; // &i32
    let (&y,) = u; // mismatched types expected type `{integer}` found reference `&_`
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下,为什么&模式在每种情况下表现不同?我想它以某种方式与人体工程学相匹配,也许一些强制起作用了?但我无法理解它。

Evi*_*Tak 10

你说得对,这是符合人体工程学的。第一种情况应该是不言自明的,但第二种和第三种情况可能有点违反直觉。

在第二种情况下:

  • (x,)是非参考模式(请参阅RFC 中的第二个示例)。t组引用被取消引用,并x绑定为 a ref,因为它也是非引用模式。请注意,这t.0是一开始的引用,因此导致了x双重引用。

  • (&y,)也是一种非参考模式。元t组再次被取消引用到 a (&i32,)。然而,&y参考模式与&i32参考相匹配。因此y与模式绑定move并且是一个i32

在第三种情况下:

  • 使用与第二种情况相同的推理,u通过Deref强制转换为 来取消引用(i32,),并且x是非引用模式,绑定在ref模式中。因此x是一个&i32.

  • 再次与第二种情况具有相同的推理,u取消引用(i32,). 然后,引用模式与非引用&y匹配,这会导致错误。i32