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

Is there a nicer alternative to ".map(|x| *x)" before ".collect()"?

在以下代码段中:

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

有没有更好的方法让 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)
}

可以这样使用:

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

使用.copied:

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

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

作为使用 copied()cloned() 的替代方法,您可以使用 into_iter() 而不是 iter() 来使用源容器:

let b: Vec<usize> = a.into_iter().filter(|x| *x > 5).collect();

如果在代码中的这一点之后不需要原始容器,则可以使用它。