如何在可变迭代器上实现drop_while?

时间:2020-06-26 13:15:45

标签: rust iterator mutable

是否有一种有效的方法来为可变迭代器执行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();

但是,这是正确的方法吗?这样不会浪费资源吗?

2 个答案:

答案 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')"
}

playground

答案 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')
相关问题