为什么在引用向量上迭代时,我会得到对类型的双重引用



考虑以下最小可重复性。我有一个对象向量和一个hashmap,其中每个值都是objects向量中对对象的引用向量。

然后我从HashMap中得到一个值(它是对引用向量的引用(,我想过滤它,这样我就可以得到对象的引用向量。然而,当我进行iter过滤器收集时,编译器声称我正在迭代&O(而不是我期望的&O(和错误。

我可以";"修复";这个错误是通过取消对map函数的注释来实现的,该函数取消了对迭代对象的引用,但我认为这不是正确的做法。

use std::collections::HashMap;
struct O {
a: i32,
b: i32,
}
fn main() {
let mut objects = vec![
O { a: 1, b: 0 },
O { a: 2, b: 0 },
O { a: 3, b: 0 },
O { a: 4, b: 1 },
];
let mut b_to_o: HashMap<i32, Vec<&O>> = HashMap::new();
for o in &objects {
b_to_o.entry(o.b).or_insert(Vec::new()).push(&o);
}
let b_zero: &Vec<&O> = b_to_o.get(&0).unwrap();
let b_zero_a_odd: Vec<&O> = b_zero
.iter()
.filter(|o| o.a % 2 == 0)
//.map(|o| *o)
.collect::<Vec<&O>>();
}

注意:在这个例子中,对象的矢量不一定是mut,但它必须在我正在复制的代码中。

您有一个Vec<&T>iter产生&Output,其中OutputVec的内部类型,在本例中为&T,您得到:&Output=>CCD_ 11。

取消引用双重引用没有错,你可以使用map,也可以使用filter_map作为一个单独的步骤(注意闭包参数中的模式数学可以直接取消引用|&o|(:

let b_zero_a_odd: Vec<&O> = b_zero
.iter()
.filter_map(|&o| if o.a % 2 == 0 { Some(o) } else { None })
.collect::<Vec<&O>>();

游乐场

最新更新