泛化引用迭代器和值迭代器

Posted

技术标签:

【中文标题】泛化引用迭代器和值迭代器【英文标题】:Generalize over iterators over references and iterators over values 【发布时间】:2015-10-24 10:54:03 【问题描述】:

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

但是,我也希望我的函数也可以在值上处理迭代器(无需复制代码)。我该怎么做?

以下不起作用:

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】:

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

【讨论】:

对不起,我应该澄清一下,我实际上是在实现一个特征,而且项目的类型是通用的。 请再看看 @dspyz 我认为更新完全改变了这个问题。您可以更新您的标题以反映您更复杂的特定实例或回滚您的更改并提出后续问题。

以上是关于泛化引用迭代器和值迭代器的主要内容,如果未能解决你的问题,请参考以下文章

迭代器和生成器

迭代器和迭代器的基类

5.迭代器和生成器

python -- 迭代器和装饰器

迭代器和生成器

迭代器和生成器