我们可以在 Rust 切片中使用步骤吗?

Can we use step in Rust slice?

提问人:Walker 提问时间:7/28/2023 更新时间:7/28/2023 访问量:173

问:

在 python 中,我们可以在奇数索引中获取子数组,例如:

odd = array[1::2]

我们可以在 Rust 中使用简单的语法或任何特征来做到这一点吗?喜欢:

let vec = vec![1; 10];
let sli = &vec[0.2.10];

上面的代码无法通过编译。

切片

评论

0赞 Stargateur 7/28/2023
答案是否定的,但你的问题表明你缺乏 Rust 知识,你想要什么,可能是该步骤的数组上的迭代器,请参阅 doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by
0赞 Walker 7/28/2023
太大了,不能踩到记忆,哈哈。

答:

6赞 cafce25 7/28/2023 #1

不,切片

连续序列的动态大小视图

您可以将原始切片的引用收集到一个 不过:Vec

let odd: Vec<&i32> = array.iter().step_by(2).collect();

但是对于许多应用程序,您甚至根本不需要,但可以直接使用。collectIterator

1赞 Akhilesh Pandey 7/28/2023 #2

不可以,Rust 切片语法不支持。

您可以通过将方法与 and 方法结合使用来创建一个迭代器来实现它,该迭代器仅生成奇数索引的元素。如果你需要结果是一个 ,你可以将这个迭代器收集到 一个 ,.iter().enumerate().filter()VecVec

let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odd: Vec<_> = vec.iter()
                     .enumerate()
                     .filter(|&(i, _)| i % 2 != 0)
                     .map(|(_, e)| e)
                     .collect();
println!("{:?}", odd);

请注意,索引是从 0 开始的,因此这为您提供了奇数索引的元素,这些元素是原始向量的偶数元素。如果希望元素处于偶数索引,可以更改 。i % 2 != 0 to i % 2 == 0

6赞 Jason Orendorff 7/28/2023 #3

Rust 没有这个 Python 功能。但是,您可以使用 .step_by() 方法将步长应用于任何迭代器。

let v: Vec<i32> = (0..10).step_by(2).collect();
assert_eq!(v, vec![0, 2, 4, 6, 8]);

但是,请注意,步长必须为正,这与 Python 不同,在 Python 中,负步长意味着向后走列表。要在 Rust 中反转迭代器,通常可以使用 .rev()。

let v2: Vec<i32> = v.into_iter().rev().collect();
assert_eq!(v2, vec![8, 6, 4, 2, 0]);

如果你使用的是张量库,比如 ndarray,它将有自己的步长切片方式,比如这个 ndarray 宏