提问人:Walker 提问时间:7/28/2023 更新时间:7/28/2023 访问量:173
我们可以在 Rust 切片中使用步骤吗?
Can we use step in Rust slice?
问:
在 python 中,我们可以在奇数索引中获取子数组,例如:
odd = array[1::2]
我们可以在 Rust 中使用简单的语法或任何特征来做到这一点吗?喜欢:
let vec = vec![1; 10];
let sli = &vec[0.2.10];
上面的代码无法通过编译。
答:
6赞
cafce25
7/28/2023
#1
不,切片是
连续序列的动态大小视图
您可以将原始切片的引用收集到一个 不过:Vec
let odd: Vec<&i32> = array.iter().step_by(2).collect();
但是对于许多应用程序,您甚至根本不需要,但可以直接使用。collect
Iterator
1赞
Akhilesh Pandey
7/28/2023
#2
不可以,Rust 切片语法不支持。
您可以通过将方法与 and 方法结合使用来创建一个迭代器来实现它,该迭代器仅生成奇数索引的元素。如果你需要结果是一个 ,你可以将这个迭代器收集到 一个 ,.iter()
.enumerate()
.filter()
Vec
Vec
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 宏。
评论