gpt4 book ai didi

rust - (可选)在自定义迭代器 `skip`函数中调用 `next()`

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

我有一个自定义迭代器,我想有选择地在自定义.skip(...)方法中调用.next()。但是,由于Skip != Iterator,我收到类型错误。
示例代码如下:

struct CrossingIter<'a, T> {
index: usize,
iter: std::slice::Iter<'a, T>,
}

impl<'a, T: Float> Iterator for CrossingIter<'a, T> {
type Item = (usize, T);


fn next(&mut self) -> Option<(usize, T)> {
let iter = (&mut self.iter).enumerate();

let iter = if self.index == 0 {
self.index += 3;
iter.skip(3)
} else {
iter
}

// lots of code here working with the new iterator

iter.next()
}
}
问题是,在调用 .skip(3)之后, iter的类型已更改。一种解决方案是在 // lots of code ...语句的每个分支中复制 if,但我宁愿不这样做。
我的问题是:有没有一种方法可以有条件地将 skip(...)应用于迭代器,并继续使用它而无需复制一堆代码?

最佳答案

skip 旨在构造一个新的迭代器,这在您希望代码至少在表面上保持不变的情况下非常有用。但是,在您的情况下,您想在使现有迭代器保持有效的同时对其进行扩展。
advance_by 可以满足您的要求,但是它是Nightly的,因此它无法在Stable Rust上运行。

if self.index == 0 {
self.index += 3;
self.iter.advance_by(3);
}
我们可以滥用 nth 获得我们想要的东西,但这不是很习惯。
if self.index == 0 {
self.index += 3;
self.iter.nth(2);
}
如果我在生产中看到该代码,我会很困惑。
最简单但并非令人满意的答案是重新实现 advance_by作为辅助函数。 The source可用,很容易适应
fn my_advance_by(iter: &mut impl Iterator, n: usize) -> Result<(), usize> {
for i in 0..n {
iter.next().ok_or(i)?;
}
Ok(())
}
话虽如此,如果您的用例实际上只是跳过前三个元素,那么您所需要做的只是从 skip调用开始,并假设您的迭代器始终是 Skip
struct CrossingIter<'a, T> {
index: usize,
iter: std::iter::Skip<std::slice::Iter<'a, T>>,
}

关于rust - (可选)在自定义迭代器 `skip`函数中调用 `next()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66502055/

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