Рассмотрим эти две черты:Проверка равных типов, объединенных в котором положение
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
и
trait SeeekingIterator {
type Item;
fn next(&mut self, other: &Self::Item) -> Option<Self::Item>;
}
Теперь предположим, что я хотел сделать что-то вроде std::iter::Peekable
для структур, которые реализуют как Iterator
и SeekingIterator
.
Это будет выглядеть немного как:
struct PeekableSeekable<I> where
I: Iterator + SeekingIterator
{
iter: I,
peeked: Option<<I as Iterator>::Item>
}
Было бы реализовать
fn peek(&mut self) -> Option<&<I as Iterator>::Item>;
и
fn peek_seek(&mut self, other: &<I as SeekingIterator>::Item) -> Option<&<I as SeekingIterator>::Item>
Проблема теперь, что это будет работать только в том случае <I as Iterator>::Item == <I as SeekingIterator>::Item
.
Я не знаю, как выразить это внутри предложения where
. Я притворяется с помощью
Option<<I as Iterator>::Item>: From<Option<<I as SeekingIterator>::Item>>
и
Option<<I as SeekingIterator>::Item>: From<Option<<I as Iterator>::Item>>
А затем вызвать Option::from
когда преобразование необходимо. Это кажется немного уродливым, и мне интересно, можно ли решить эту проблему более кратко.
Пожалуйста, рассмотреть вопрос о создании [MCVE] в будущем. Было очень сложно догадаться о том, что содержится в вашем блоке 'impl'. – Shepmaster