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

标签 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();
但是,这是正确的方法吗?这样不会浪费资源吗?

最佳答案

我相信除了 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

关于rust - 如何在可变迭代器上实现drop_while?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62595557/

相关文章:

rust - 当长度不变时, Vec::splice() 是否有效?

c++ - 存储指向固定大小 vector 内的元素的指针

objective-c - 添加代码以动态阻止

rust - 以编程方式调用断点

rust - 借用亲子关系检查器

c++ - 为什么类 .setTexure() 方法的行为不同?

java - 对值进行两次迭代 (MapReduce)

c# - 如何修改我传入的对象集合的字段

rust - 在循环中发生变异时,可变借用时间过长

rust - 是否记录了 Cargo 可以下载和捆绑同一个箱子的多个版本?