Черта 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
подходит, но для первого вы должны определить пользовательский интерфейс.