我能为您翻译:如何从 &[u32] 中过滤出特定的数字并将其转换为 Vec<u32>?

3
给定一个数组,我希望过滤掉数字0。这可以是任何数字或任何其他规则或条件。
以下是一些可行的版本,但我觉得这可以更简单地完成:
fn test(factors: &[u32]) {
    let factors1 = factors
        .iter()
        .map(|&x| x as u32)
        .filter(|x| *x != 0)
        .collect::<Vec<u32>>();

    let factors1 = factors
        .iter()
        .map(|&x| x as u32)
        .filter(|&x| x != 0)
        .collect::<Vec<u32>>();

    let factors2 = factors
        .iter()
        .filter(|x| **x != 0)
        .collect::<Vec<&u32>>();

    let factors3 = factors
        .iter()
        .filter(|&&x| x != 0)
        .collect::<Vec<&u32>>();
}

我原本期望的更简单的方式是这样的(但这种方法无效):
let factors4 = factors.iter().filter(|x| x != 0).collect();

以下是有用的事情:

  • 是否可以将&u32克隆或转换为u32
  • 是否有一种方法可以将&[u32]克隆为[u32]

有办法将 &[u32] 克隆为 [u32] 吗?无法直接构建切片,你需要在某处使用引用。 - Stargateur
@Stargateur &[u32] = 对 u32 数组的引用?肯定有一种方法可以创建一个具有元素值(而非引用)的新 u32 数组吧? - xx1xx
2
正如我所说的,[u32]是一个切片(slice),而不是一个数组。一个数组的写法是[u32; 42]。请确保使用准确的术语。你可以构建一个数组,但不能构建一个切片(没有引用的情况下),你可以构建一个切片的引用,但不能单独构建一个切片。我给你一个切片,切片可以指向&[u32][u32],但你可以构建一个&[u32],而不能构建一个[u32] - Stargateur
1
您可以使用切片上的 to_vec 方法来构建一个 Vec<u32>(参见 https://dev59.com/WFYN5IYBdhLWcg3wFky2)。 - trent
2个回答

2

至少有Iterator.copied()吗?

let factors4: Vec<u32> = factors
    .iter()
    .copied()
    .filter(|&x| x != 0)
    .collect();

谢谢!复制似乎是一个不错的选择:当你有一个对&T的迭代器,但你需要一个对T的迭代器时,这非常有用。 - xx1xx
为什么我们在_filter_ .filter(|&x| x != 0)中仍然需要使用引用符号? - xx1xx
1
@xx1xx:由于filter无法获取迭代器中的值的所有权,它仍然需要将其传递。 - Ry-

2
您可以使用 filter_map 一步完成filtermap
fn make_vec_of_nonzero(factors: &[u32]) -> Vec<u32> {
    factors
        .iter()
        .filter_map(|&x| if x == 0 { None } else { Some(x) })
        .collect()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接