我正在使用filter
,但是我不明白为什么我应该使用**x > 1
切片但使用*x > 1
范围。
fn main() {
let a = [0, 1, 2, 3];
let a_iter = a.iter().filter(|x: &&i32| **x > 1); // x: &&i32
let x: Vec<&i32> = a_iter.collect();
println!("{:?}", x);
let b = 0..4;
let b_iter = b.filter(|x: &i32| *x > 1); // x: &i32
let y: Vec<i32> = b_iter.collect();
println!("{:?}", y);
}
医生说应该是**x > 1
。
slice::iter
,例如a.iter()
您的示例,在对值的引用上生成一个迭代器。Range
s是产生非参考值的迭代器。
该filter(<closure>)
方法采用一个<closure>
按引用获取迭代器值的方法,因此,如果您的迭代器已经生成了引用,则您将获得对引用的引用,如果迭代器生成了非引用值,则将获得对这些值的引用。
如果我们Vec
在两个示例中都使用a ,则区别变得更容易理解:
fn main() {
let a = vec![0, 1, 2, 3];
let a_iter = a.iter(); // iter() returns iterator over references
let x: Vec<&i32> = a_iter.filter(|x: &&i32| **x > 1).collect();
println!("{:?}", x);
let b = vec![0, 1, 2, 3];
let b_iter = a.into_iter(); // into_iter() returns iterator over values
let y: Vec<i32> = b_iter.filter(|x: &i32| *x > 1).collect();
println!("{:?}", y);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句