我们可以在Rust slice中使用step吗?

问题描述 投票:0回答:3

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

odd = array[1::2]

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

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

以上代码无法通过编译。

rust slice
3个回答
1
投票

不,切片

连续序列的动态大小视图

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

Vec
中:

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

但对于许多应用程序,您甚至根本不需要

collect
,而是可以直接使用
Iterator


1
投票

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宏


0
投票

不,Rust 切片语法不支持。

您可以通过使用

.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

© www.soinside.com 2019 - 2024. All rights reserved.