如何使用简单类型创建复合迭代器

时间:2016-03-25 00:04:08

标签: rust

Rust中的迭代器非常方便和强大,特别是它们被设计为易于组合,如本例中的文档:

let iter = [1, 4, 2, 3].iter()
        .cloned()
        .inspect(|x| println!("about to filter: {}", x))
        .filter(|&x| x % 2 == 0)
        .inspect(|x| println!("made it through filter: {}", x));
然而,有一个缺点。请注意,iter此处没有声明的类型。原因是因为类型太可怕了;如果我尝试它,我会得到类型:

iter: core::iter::Inspect<
        core::iter::Filter<
          core::iter::Inspect<
            core::iter::Cloned<core::slice::Iter<'a, usize>>,
            [closure@test.rs:...]>,
          [closure@test.rs:...]>,
        [closure@test.rs:...]>

事实上,由于封闭类型,如果我愿意,我甚至不能输入。 (我可以通过使用显式名称定义函数来避免这个问题。)与Java相比,这似乎过于复杂,因为它每次只能将类型提升为Iterator<T>,但这对于Rust&#39; s单态+静态调度工作。

假设我想将其定义为迭代器适配器,即:

fn adapter<'a, I: Sized + Iterator<Self=&'a usize>>(i: I) -> MyAdapter<'a, I> {
    i.cloned()
        .inspect(|x| println!("about to filter: {}", x))
        .filter(|&x| x % 2 == 0)
        .inspect(|x| println!("made it through filter: {}", x))
}

我不想向我的代码的客户公开内部适配器链的详细信息,而是给它新名称MyAdapter<'a, I>,但我也不想写我的自己的next()方法,因为我已经有了一个非常好的复合实现。有没有办法满足这两个目标,还有静态调度?

0 个答案:

没有答案