REST API迭代器:跳过并接受

时间:2019-04-23 20:26:12

标签: rest rust iterator

我正在考虑为现有的REST API实现std::iter::Iterator。该API只需添加查询参数(skip)即可接受take...&skip=10&take=10的参数。

如果我可以通过发送用于迭代器skip()take()的内容来利用这些参数,那就太好了。由于Rust迭代器很懒,所以感觉这是可行的。但是,我在寻找实现Iterator时发现的只是next()方法。

示例:

let result = api.search("something").skip(5).take(10).collect();

// In my iterator implementation I'd like to make the following request:
// https://my.api.endpoint/?search=something&skip=5&take=10

1 个答案:

答案 0 :(得分:1)

Iterator特性只有一个 required 方法,例如next()方法。此方法必须用于实现该特征的所有类型。具有Iterator特性的所有其他方法都是提供的方法。它们具有默认实现,您不必不必实现它们,但仍然可以针对特定类型覆盖它们。

但是,您无法更改skip()take()的声明:

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

因此这些方法消耗旧的迭代器,并分别返回类型为std::iter::Skip<Self>std::iter::Take<Self> new 迭代器。调用其中一种方法后,您将无法控制链中第二种方法的语义,因为该方法将在标准库中的这两种类型之一上而不是您的自定义类型中被调用,因此您将最终调用该方法的默认实现。

您可以通过覆盖迭代器上的skip()来使nth()大部分工作,因为SkipTake的实现将nth()转发到了基础迭代器,但无法使take()正常工作。

我建议分离API的各个部分以构建查询并遍历结果。对于后者,Iterator特质很好,但是对于前者,您应该定义一个自定义接口。