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
&
,您需要知道的都有了。谢谢,这非常有用!