在“.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();
如果在代码中的这一点之后不需要原始容器,则可以使用它。
在以下代码段中:
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();
如果在代码中的这一点之后不需要原始容器,则可以使用它。