2016-11-11 3 views
1

Рассмотрим эти две черты:Проверка равных типов, объединенных в котором положение

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 когда преобразование необходимо. Это кажется немного уродливым, и мне интересно, можно ли решить эту проблему более кратко.

+0

Пожалуйста, рассмотреть вопрос о создании [MCVE] в будущем. Было очень сложно догадаться о том, что содержится в вашем блоке 'impl'. – Shepmaster

ответ

4

Ссылка одна черта от другого признака ограничения:

struct PeekableSeekable<I> 
    where I: Iterator 
{ 
    iter: I, 
    peeked: Option<I::Item>, 
} 

impl<I> PeekableSeekable<I> 
    where I: Iterator<Item = <I as SeekingIterator>::Item> + SeekingIterator 
{ 
    // Implement 
} 
Смежные вопросы