假设我有一个向量,我只想保留其中的偶数元素。我需要使用 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
我认为也许对于没有实现Copy
特性的类型,必须在.cloned()
之前使用,但这似乎不是这种情况:嵌套向量示例。此外,由于filter使用FnMut(&Self::Item)
,我认为这不应该是一个问题。在
filter()
之前使用cloned()
是否有优势?这更多地是一个风格问题吗?如果是的话,有喜欢的风格吗?
clone
应该始终被视为“不便宜”,编译器应该尽其职责并优化“无用的引用”。如果你把cloned()
放在后面,即使你改变了代码,你仍然会做“正确的事情”,但如果你把它放在前面,你就需要记得把cloned()
移到后面。 - Stargateurcopied()
,我会同意。 - Stargateur