gpt4 book ai didi

rust - 在谓词失败后在迭代器中获取一个额外元素的规范方法是什么?

转载 作者:行者123 更新时间:2023-12-03 11:26:03 25 4
gpt4 key购买 nike

我有一个 Vec<bool>我想创建一个迭代器,它停止并包括第一个 false ;我该如何实现?我一直在看take_while方法,但它提前停止了一个元素。例如,如果输入是 vec![true, true, true, false, false] , 我想要一个相当于 vec![true, true, true, false].iter() 的迭代器,但我找不到以功能方式表达它的好方法。我考虑过以下方法:

// method 1
// This one triggers the side effects of do_something_with_x
// for the right elements, but it seems like bad style. It
// also doesn't give me an iterator that I can chain on, I
// would need to use the side effect creatively.
input
.iter()
.map(|x| {
do_something_with_x(x);
x
})
.take_while(|x| *x)
.for_each(|_|());

// method 2
// This seems a little better, but I don't like how I have
// to iterate through it twice. My code isn't performance
// sensitive so that's not the reason, but it just looks bad to me.
let len = input.iter().position(|x| !*x);
let result = input.iter().take(len);

我已经大大简化了问题以使其更容易理解,向量是不同的类型并且我使用了不同的谓词。我也在考虑第三种方法,该方法涉及压缩两个偏移一个的相同事物的迭代器,但我不太确定如何最好地实现它,而且无论如何它看起来都不太可读。解决此类问题的规范方法是什么?

最佳答案

您可以使用 Iterator::scan ,它通过调用包含每个项目和可变状态的闭包来生成新的迭代器。

通过让状态指示我们是否应该在下一个项目结束,我们可以在第一个虚假项目之后停止:

input
.iter()
.scan(false, |is_done, item| {
if *is_done { return None; }
if !item { *is_done = true; }
Some(item)
})
.for_each(|_| {});

关于rust - 在谓词失败后在迭代器中获取一个额外元素的规范方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com