RESTAPI迭代器:跳过并执行

RESTAPI迭代器:跳过并执行,rest,rust,iterator,Rest,Rust,Iterator,我正在考虑为现有的RESTAPI实现std::iter::Iterator。API接受skip和take的参数,只需向查询参数中添加…&skip=10&take=10 如果我可以通过发送迭代器skip和take所使用的任何内容来利用这些参数,那就太好了。因为Rust迭代器是懒惰的,所以感觉这是可行的。但我在寻找实现迭代器时发现的是下一种方法 例如: 让result=api.searchsomething.skip5.take10.collect; //在迭代器实现中,我想提出以下请求: // h

我正在考虑为现有的RESTAPI实现std::iter::Iterator。API接受skip和take的参数,只需向查询参数中添加…&skip=10&take=10

如果我可以通过发送迭代器skip和take所使用的任何内容来利用这些参数,那就太好了。因为Rust迭代器是懒惰的,所以感觉这是可行的。但我在寻找实现迭代器时发现的是下一种方法

例如:

让result=api.searchsomething.skip5.take10.collect; //在迭代器实现中,我想提出以下请求: // https://my.api.endpoint/?search=something&skip=5&take=10 迭代器特性只有一个必需的方法,即下一个方法。必须为实现trait的所有类型实现此方法。迭代器特性的所有其他方法都是由方法提供的。它们有默认实现,您不必实现它们,但仍然允许您为特定类型重写它们

但是,您不能更改skip and take的声明:

因此,这些方法使用旧的迭代器,并分别返回std::iter::Skip或std::iter::Take类型的新迭代器。调用其中一个方法后,您将无法控制链中第二个方法的语义,因为该方法将从标准库而不是自定义类型中调用这两种类型中的一种,因此您将最终调用该方法的默认实现

您可以通过在迭代器上重写n,使skip大部分按您的意愿工作,因为skip和forward n的实现都是在底层迭代器上实现的,但是使Take正常工作是不可能的

我建议分离构建查询的API部分并迭代结果。对于后者,迭代器特性很好,但是对于前者,您应该定义一个自定义接口

fn skip(self, n: usize) -> Skip<Self> where Self: Sized;
fn take(self, n: usize) -> Take<Self> where Self: Sized;