要在防止移动的同时匹配结构,我想使用引用来进行匹配。所以下面的代码将完成这项工作:
struct Foo(i32);
fn main() {
let x = Foo(1);
match &x {
ref a => println!("hello"),
}
println!("{}", x.0);
}
但我很惊讶地发现下面的代码也可以工作,它实际上匹配了一个结构体(x
)和一个引用(ref a
)。但是,这里不应该是类型不匹配吗?
struct Foo(i32);
fn main() {
let x = Foo(1);
match x {
ref a => println!("hello")
}
println!("{}", x.0);
}
最佳答案
ref
不是从值中“剥离”某些内容的模式的正常部分,而是名称绑定(bind)的修饰符,如 mut
。它指示名称绑定(bind)到对值的引用而不是直接绑定(bind)到值。
让我们看看每种情况下 a
的类型:
match &x {
ref a => {
let () = a;
}
}
match x {
ref b => {
let () = b;
}
}
let () = a;
是一个找出a
类型的技巧。事实上,编译器告诉我们:
|
7 | let () = a;
| ^^ expected &&Foo, found ()
[...]
|
12 | let () = b;
| ^^ expected &Foo, found ()
所以在第一种情况下,我们引用了一个引用,即&&Foo
。这是因为我们匹配表达式 &x
(类型:&Foo
),然后告诉编译器“通过引用”绑定(bind)名称。
关于rust - 使用引用匹配结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40337822/