Обобщайте итераторы по ссылкам и итераторы по значениям

Я хочу реализовать черту, для которой одна из функций принимает итератор в качестве аргумента, а затем оперирует значениями, возвращаемыми этим итератором как неизменяемыми ссылками.

Однако я также хотел бы, чтобы моя функция работала и с итераторами по значениям (без дублирования кода). Как я могу это сделать?

Следующее не работает:

impl<T, I: Iterator> FilterItem for SortedFilter<I> where  T: Ord, I::Item: Borrow<T> {
    ...
}

я получил

error: the type parameter `T` is not constrained by the impl trait, self type, or predicates

person dspyz    schedule 02.08.2015    source источник


Ответы (1)


Вы ищете черту Borrow:

При написании универсального кода часто желательно абстрагироваться от всех способов заимствования данных из заданного типа.

use std::borrow::Borrow;

fn print_it<I, T>(iter: I)
    where I: Iterator<Item = T>,
          T: Borrow<u8>
{
    for v in iter {
        let a: &u8 = v.borrow();
        println!("{}", a);
    }
}


fn main() {
    let vals = vec![1,2,3];
    print_it(vals.iter()); // Iterator of references
    print_it(vals.into_iter()); // Iterator of values
}
person Shepmaster    schedule 02.08.2015
comment
Извините, я должен был пояснить, что на самом деле я реализую черту, а также тип элемента является универсальным. - person dspyz; 02.08.2015
comment
Пожалуйста, взгляни еще раз - person dspyz; 02.08.2015
comment
@dspyz Думаю, что обновление полностью меняет вопрос. Вы можете обновить заголовок, чтобы отразить гораздо более сложный конкретный экземпляр, или откатить изменения и задать дополнительный вопрос. - person Shepmaster; 02.08.2015