【问题标题】:How to implement drop_while on mutable iterator?如何在可变迭代器上实现 drop_while?
【发布时间】:2020-06-26 13:15:45
【问题描述】:

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

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

【问题讨论】:

  • iter.find(|x| *x &gt; 'c') ?

标签: rust iterator mutable


【解决方案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

【讨论】:

    【解决方案2】:

    你可以使用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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 2017-07-03
      • 2016-01-23
      • 2020-05-21
      • 2016-03-30
      • 2018-09-10
      • 2020-10-24
      • 2016-06-15
      相关资源
      最近更新 更多