假设我有矢量,我只想保留偶数元素。我需要使用cloned()
和filter()
。例如:应将.cloned()放在.filter()之前或之后
fn main() {
let my_vec: Vec<i32> = vec![1,2,3,4];
let my_vec_1: Vec<i32> = my_vec.iter().cloned().filter(|&x| x % 2 == 0).collect();
println!("{:?}", my_vec_1);
let my_vec_2: Vec<i32> = my_vec.iter().filter(|&x| x % 2 == 0).cloned().collect();
println!("{:?}", my_vec_2);
}
两个办法工作。在filter()
后使用cloned()
似乎效率更高一点。因为那样我不必将迭代器的所有元素从&T
转换为T
,但只能转换已经过滤的元素。在我的例子中,这是一半的元素。
但是,我似乎在filter()
之前应用了cloned()
。这里有一个例子:method.inspect
我想,也许.cloned()
有不实现Copy
特质类型被使用过,但它似乎并没有这样的情况:nested vec example。另外,因为过滤器使用FnMut(&Self::Item)
,我不认为这应该是一个问题。
在filter()
之前使用cloned()
有什么好处?这更多是一个风格问题吗?如果是这样,是否有首选风格?