Rust 使用引用匹配结构
要在阻止移动的同时匹配结构,我想使用引用进行匹配。因此,以下代码将完成此工作:Rust 使用引用匹配结构,rust,match,Rust,Match,要在阻止移动的同时匹配结构,我想使用引用进行匹配。因此,以下代码将完成此工作: struct Foo(i32); fn main() { let x = Foo(1); match &x { ref a => println!("hello"), } println!("{}", x.0); } 但我惊讶地发现以下代码也可以工作,它实际上将一个结构(x)与一个引用(refa)相匹配。但是,这不应该是类型不匹配吗 struct Fo
struct Foo(i32);
fn main() {
let x = Foo(1);
match &x {
ref a => println!("hello"),
}
println!("{}", x.0);
}
但我惊讶地发现以下代码也可以工作,它实际上将一个结构(x
)与一个引用(refa
)相匹配。但是,这不应该是类型不匹配吗
struct Foo(i32);
fn main() {
let x = Foo(1);
match x {
ref a => println!("hello")
}
println!("{}", x.0);
}
ref
不是从值中“剥离”某些内容的模式的正常部分,而是名称绑定的修饰符,如mut
。它指示名称绑定到对值的引用,而不是直接绑定到值
让我们看看在每种情况下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
),然后告诉编译器“通过引用”绑定名称 ref
表示“参考”。它不是一个类型。请参阅此博客文章。关于ref
和&
,您需要知道的都有了。谢谢,这非常有用!