Итератор для REST API: пропустить и взять - PullRequest
0 голосов
/ 23 апреля 2019

Я думаю о реализации std::iter::Iterator для существующего REST API.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 Ответ

1 голос
/ 24 апреля 2019

Черта Iterator имеет только один обязательный метод, то есть метод 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> соответственно.После вызова одного из методов вы не сможете управлять семантикой второго метода в цепочке, поскольку этот метод будет вызываться для одного из этих двух типов из стандартной библиотеки, а не из пользовательского типа, поэтому вы будетев конечном итоге вызов реализации метода по умолчанию.

Вы можете заставить skip() работать в основном так, как вы намереваетесь, переопределив nth() на итераторе, поскольку реализации Skip и Take forward nth() к базовому итератору, но заставить take() работать должным образом не представляется возможным.

Я рекомендую разделить части API, формируя запрос и перебирая результаты.Для последнего черта Iterator подходит, но для первого вы должны определить пользовательский интерфейс.

...