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

Wal*_*ker 4 slice rust

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

odd = array[1::2]
Run Code Online (Sandbox Code Playgroud)

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

let vec = vec![1; 10];
let sli = &vec[0.2.10];
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*rff 8

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

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

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

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

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


caf*_*e25 6

不,切片

连续序列的动态大小视图

您可以将原始切片中的引用收集到虽然Vec

let odd: Vec<&i32> = array.iter().step_by(2).collect();
Run Code Online (Sandbox Code Playgroud)

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