在Python中,我们可以像这样获取奇数索引的子数组:
上述代码无法通过编译。
odd = array[1::2]
我们可以用Rust来做这个,使用简单的语法或任何trait吗?像这样:
let vec = vec![1; 10];
let sli = &vec[0.2.10];
上述代码无法通过编译。
odd = array[1::2]
我们可以用Rust来做这个,使用简单的语法或任何trait吗?像这样:
let vec = vec![1; 10];
let sli = &vec[0.2.10];
.step_by()
方法来对任何迭代器应用步长。let v: Vec<i32> = (0..10).step_by(2).collect();
assert_eq!(v, vec![0, 2, 4, 6, 8]);
.rev()
。let v2: Vec<i32> = v.into_iter().rev().collect();
assert_eq!(v2, vec![8, 6, 4, 2, 0]);
如果您正在使用张量库,例如ndarray,它会有自己的切片方式,就像this ndarray macro一样。
不,一个slice是
对一个连续序列的动态大小视图
你可以将原始切片的引用收集到一个Vec
中:
let odd: Vec<&i32> = array.iter().step_by(2).collect();
但对于许多应用程序,您甚至不需要完全 收集
,而是可以直接使用 迭代器
。
不支持 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);