返回一个更简单的Iterator接口而不是Rust中的Map

时间:2014-10-12 19:43:06

标签: rust

我想写这个:

fn fibs() -> std::iter::Iterator<int> {
    return std::iter::iterate((1i, 1i), |(a, b)| { (b, a + b) }).map(|(a, _)| a)
}

但如果我这样做,我会收到此错误:

error: explicit lifetime bound required
fn fibs() -> std::iter::Iterator<int> {
             ^^^^^^^^^^^^^^^^^^^^^^^^

如果我写出完整的界面,它会编译:

fn fibs() -> std::iter::Map<'static, (int, int), int, std::iter::Iterate<'static, (int, int)>> {
    return std::iter::iterate((1i, 1i), |(a, b)| { (b, a + b) }).map(|(a, _)| a)
}

有没有办法返回更简单的界面?

2 个答案:

答案 0 :(得分:6)

目前还没有任何方法可以返回一个抽象类型,例如Iterator<T>,就像你不能将它指定为一个变量的类型一样(let x: Iterator<uint>;不能为它编译原因)。

has been discussed当然是理想的;当它完成时,它可能采用fn fibs() -> impl Iterator<uint>的形式,但你还不能这样做。

答案 1 :(得分:1)

正如@ChrisMorgan所说,现在你无法返回一个抽象类型。如果要创建公共API并且希望避免过多地依赖iteratemap的具体实现,则可以将返回类型封装到您自己的结构中(这或多或少是集合)在std库本身就可以了。)

类似的东西:

// updated to rustc 0.13.0-nightly (2015-01-02) 
use std::iter::{Map, iterate, Unfold};

type Fibs = Map<(int, int), int, Unfold<(int, int), 
    (fn((int, int)) -> (int, int), Option<(int, int)>, bool), 
    fn(&mut (fn((int, int)) -> (int, int), Option<(int, int)>, bool)) -> 
        Option<(int, int)>>, fn((int, int)) -> int>;

struct Fibs2 {
    iter: Fibs,
}

impl Fibs2 {
    fn iter() -> Fibs2 {
        fn inner((a, b): (int, int)) -> (int, int) { (b, a + b) }
        let in_fn = inner as fn((int, int)) -> (int, int);

        fn first((a, _): (int, int)) -> int { a }
        let p_first = first as fn((int, int)) -> int;

        Fibs2{ iter: iterate((1i, 1i), in_fn).map(p_first) }
    }
}

impl Iterator<int> for Fibs2 {
    fn next(&mut self) -> Option<int> {
        self.iter.next()
    }
}

fn main() {
    for fib_n in Fibs2::iter().take(10) {
        println!("{}", fib_n);
    } 
}