在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)
上面的代码无法通过编译。
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 宏。
不,切片是
连续序列的动态大小视图
您可以将原始切片中的引用收集到虽然Vec:
let odd: Vec<&i32> = array.iter().step_by(2).collect();
Run Code Online (Sandbox Code Playgroud)
但对于许多应用程序,您甚至根本不需要collect,但可以直接使用Iterator。