考虑以下最小可重复性。我有一个对象向量和一个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
,其中Output
是Vec
的内部类型,在本例中为&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>>();
游乐场