如何在 rust 中迭代 vec 或 slice 的前缀或后缀?

How to iterate prefixes or suffixes of vec or slice in rust?

我有一个向量:vec![1, 2, 3, 4]。我想知道如何:

另请参阅:

  • 适用于 &[T](即切片)的内容也适用于 &Vec<T>,因为 Deref coercion

  • 构建从0到slice.len()的索引范围:0..=slice.len()

  • std::ops::Range 实现两者 Iterator and DoubleEndedIterator。这允许您使用 rev() 方法:

    (0..=slice.len()).rev()

  • 获取给定长度的前缀:&slice[..len]

  • 要获得没有前 cut 项的后缀:&slice[cut..]

综合起来

从最短到最长迭代:

pub fn prefixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
    (0..=slice.len()).map(move |len| &slice[..len])
}

pub fn suffixes_asc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
    (0..=slice.len()).rev().map(move |cut| &slice[cut..])
}

要反转只需使用 .rev():

pub fn prefixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
    prefixes_asc(slice).rev()
}

pub fn suffixes_desc<T>(slice: &[T]) -> impl Iterator<Item = &[T]> + DoubleEndedIterator {
    suffixes_asc(slice).rev()
}

tests