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