为了在阻止移动时匹配结构,我想使用引用来进行匹配.所以下面的代码将完成这项工作:
struct Foo(i32);
fn main() {
let x = Foo(1);
match &x {
ref a => println!("hello"),
}
println!("{}", x.0);
}
Run Code Online (Sandbox Code Playgroud)
但我很惊讶地发现以下代码也有效,它实际上将struct(x)与reference(ref a)匹配.但是,这不应该是类型不匹配吗?
struct Foo(i32);
fn main() {
let x = Foo(1);
match x {
ref a => println!("hello")
}
println!("{}", x.0);
}
Run Code Online (Sandbox Code Playgroud)
ref不是模式的正常部分,从值中"剥离"某些东西,但它是名称绑定的修饰符,如mut.它指示名称直接绑定到值的引用而不是值.
让我们看看a每种情况下的类型:
match &x {
ref a => {
let () = a;
}
}
match x {
ref b => {
let () = b;
}
}
Run Code Online (Sandbox Code Playgroud)
这let () = a;是一个找出类型的技巧a.确实,编译器告诉我们:
|
7 | let () = a;
| ^^ expected &&Foo, found ()
[...]
|
12 | let () = b;
| ^^ expected &Foo, found ()
Run Code Online (Sandbox Code Playgroud)
所以在第一种情况下,我们参考了一个参考,即&&Foo.这是因为我们匹配表达式&x(类型:) &Foo,然后告诉编译器将名称"引用"绑定.