使用引用

时间:2016-10-31 07:05:11

标签: rust match

要在阻止移动的同时匹配结构,我想使用引用来进行匹配。所以下面的代码将完成这项工作:

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);
}

1 个答案:

答案 0 :(得分:9)

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),然后告诉编译器将名称“引用”绑定。