在“.collect()”之前是否有更好的替代“.map(|x| *x)”?

yai*_*chu 2 reference lifetime rust

在下面的代码片段中:

let b: Vec<usize> = a.iter().filter(|x| **x > 5).map(|x| *x).collect();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来使b成为值向量而不是引用?(代替.map(|x| *x)

有没有类似的东西:

fn iter_values<T : Copy>(c: &Vec<T>) -> std::iter::Map<std::slice::Iter<T>, fn(&T) -> T> {
    c.iter().map(|x| *x)
}
Run Code Online (Sandbox Code Playgroud)

可以像这样使用:

let b: Vec<usize> = iter_values(&a).filter(|x| *x > 5).collect();
Run Code Online (Sandbox Code Playgroud)

orl*_*rlp 5

使用.copied

let b: Vec<usize> = a.iter().copied().filter(|x| *x > 5).collect();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用.cloned适用于任何实现 的类型Clone,但请注意,这可能会导致通过克隆引用将引用转换为对象的不小的成本。