rust - 使用引用匹配结构

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

最佳答案

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/

相关文章:

loops - 如何在 for-in 循环中指定类型?

rust - 迭代递归结构时无法获取可变引用 : cannot borrow as mutable more than once at a time

r - 查找同一列中不同类别的数据框中的匹配数

excel - Range.Find 匹配列

JavaScript 找到单词最多的句子

multithreading - 使用 channel 和线程时我要等待或加入什么?

loops - 为什么我不能在两个不同的映射函数中可变地借用变量?

rust - 如何将字符串连接到宏派生中的标识?

arrays - 解析 Powershell 数组中的 RegEx IP 匹配项

c# - 将字符串列表转换为相应的int c#