不,不是;但是,您可以在收集之前轻松过滤,这实际上可以达到相同的效果。
如果你想按索引过滤,你需要添加索引,然后再剥离它:
-
enumerate(为元素添加索引)
-
filter 基于此索引
-
map 从元素中去除索引
或者在代码中:
fn main() {
let line = "Some line of text for example";
let l = line.split(" ")
.enumerate()
.filter(|&(i, _)| i == 3 )
.map(|(_, e)| e);
let lvec: Vec<&str> = l.collect();
let text = &lvec[0];
println!("{}", text);
}
如果您只希望获得单个索引(以及元素),那么使用nth 会容易得多。它在这里返回一个Option<&str>,您需要注意:
fn main() {
let line = "Some line of text for example";
let text = line.split(" ").nth(3).unwrap();
println!("{}", text);
}
如果你可以有一个任意谓词但只希望第一个匹配的元素,那么收集到Vec 是低效的:它将消耗整个迭代器(没有惰性)并可能分配大量不需要的内存完全没有。
因此,您最好使用迭代器的next 方法简单地请求第一个元素,该方法在此处返回Option<&str>:
fn main() {
let line = "Some line of text for example";
let text = line.split(" ")
.enumerate()
.filter(|&(i, _)| i % 7 == 3 )
.map(|(_, e)| e)
.next()
.unwrap();
println!("{}", text);
}
如果你想选择部分的结果,按索引,你也可以在收集之前使用skip和take,但我想你已经有足够的选择了。 p>