通过引用上的迭代器和值上的迭代器来泛化

时间:2015-08-02 04:28:21

标签: reference iterator rust pass-by-reference pass-by-value

我想实现一个特性,其中一个函数将迭代器作为参数,然后对该迭代器返回的值作为不可变引用进行操作。

但是我也希望我的函数也能在迭代器上处理值(不必重复代码)。我怎么能这样做?

以下不起作用:

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

1 个答案:

答案 0 :(得分:2)

您正在寻找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
}