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

3
在Python中,我们可以像这样获取奇数索引的子数组:
odd = array[1::2]

我们可以用Rust来做这个,使用简单的语法或任何trait吗?像这样:

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

上述代码无法通过编译。

答案是否定的,但你的问题表明你对Rust的了解不足。你可能想要一个在数组上进行步进的迭代器,请参阅https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.step_by。 - Stargateur
太巨大了,无法踩在记忆中,哈哈。 - Walker
3个回答

7
Rust没有这个Python功能。然而,你可以通过使用.step_by()方法来对任何迭代器应用步长。
let v: Vec<i32> = (0..10).step_by(2).collect();
assert_eq!(v, vec![0, 2, 4, 6, 8]);

然而,请注意步长必须为正数,不像Python中,负的步长意味着反向遍历列表。要在Rust中反转迭代器,通常可以使用.rev()
let v2: Vec<i32> = v.into_iter().rev().collect();
assert_eq!(v2, vec![8, 6, 4, 2, 0]);

如果您正在使用张量库,例如ndarray,它会有自己的切片方式,就像this ndarray macro一样。


6

不,一个slice

对一个连续序列的动态大小视图

你可以将原始切片的引用收集到一个Vec中:

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

但对于许多应用程序,您甚至不需要完全 收集,而是可以直接使用 迭代器


1

不支持 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更改为i % 2 == 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接