是否有一种有效的方法来为可变迭代器执行drop_while
?
单独使用.take_while()
是不够的,因为TakeWhile
很懒:
let s = String::from("abcdefg");
let mut it = s.chars();
it.by_ref().take_while(|x| *x != 'c');
println!("{:?}", it.next());
这将导致Some('a')
和以下警告:
unused `std::iter::TakeWhile` that must be used
可以通过运行.collect()
来解决此问题,该操作会导致需要的Some('d')
:
let _: String = it.by_ref().take_while(|x| *x < 'c').collect();
但是,这是正确的方法吗?这样不会浪费资源吗?
答案 0 :(得分:1)
我相信大多数迭代器方法都是惰性的,除了for_each
似乎很急。您可以像这样将take_while
变成drop_while
:
fn main() {
let s = String::from("abcdefg");
let mut it = s.chars();
it.by_ref().take_while(|x| *x != 'c').for_each(drop);
println!("{:?}", it.next()); // prints "Some('d')"
}
答案 1 :(得分:1)
您可以使用skip_while
:
let x = it.by_ref().skip_while(|x| *x <= 'c').next();
println!("{:?}", x); // Some('d')
等同于使用带否定谓词的find
:
let x = it.by_ref().find(|x| *x > 'c');
println!("{:?}", x); // Some('d')