Rust切片是否支持步长操作?能否实现类似Python的索引步长功能
在Rust中实现类似Python的步长切片(取奇数索引子数组)
Rust标准库的原生切片语法不支持直接指定步长,你写的&vec[0.2.10]属于无效语法,所以编译不通过。不过有几种简洁的方式实现类似Pythonarray[1::2]取奇数索引子数组的效果:
1. 用迭代器的skip+step_by方法
这是最直接的方式,借助Rust迭代器的内置方法就能实现:
let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 取奇数索引(从索引1开始,步长2)的元素,收集为新Vec let odd_indices: Vec<_> = vec.iter().skip(1).step_by(2).cloned().collect(); // 如果不需要获取元素所有权,直接收集引用即可 let odd_refs: Vec<_> = vec.iter().skip(1).step_by(2).collect();
skip(1)用来跳过第一个元素(对应Python切片的起始位置1),step_by(2)让迭代器每次步进2个元素,完美对应Python的[1::2]逻辑。
2. 自定义Trait实现类切片语法
如果想要更贴近Python切片的调用体验,可以给切片实现一个自定义Trait:
trait StepSlice { type Item; fn step_slice(&self, start: usize, step: usize) -> Vec<&Self::Item>; } impl<T> StepSlice for [T] { type Item = T; fn step_slice(&self, start: usize, step: usize) -> Vec<&Self::Item> { self.iter().skip(start).step_by(step).collect() } } // 调用方式 let vec = vec![1; 10]; let sli = vec.step_slice(1, 2);
这样调用起来更直观,和你想要的简洁语法需求匹配。
内容的提问来源于stack exchange,提问作者Walker
相关产品推荐
相关产品推荐

