在Rust中返回迭代器时隐藏内部

时间:2014-08-30 16:04:53

标签: rust

我编写了一个返回迭代器的函数,该迭代器列出了所有斐波那契数字:

fn fib<'a>() -> Unfold<'a, int, (int, int)> {
  Unfold::new((1, 1), |st| {
    let (a, b) = *st;
    *st = (b, a + b);
    Some(a)
  })
}

不幸的是,返回类型公开了很多这个函数的内部结构,比如内部状态类型(int, int)。隐藏这些内部构件有哪些选择?

1 个答案:

答案 0 :(得分:1)

正如A.B所指出的,标准方法是将其包装在结构中:

pub struct Fibonacci {
    inner: Unfold<'static, i32, (i32, i32)>
}

impl Iterator for Fibonacci {
    type Item = i32;
    fn next(&mut self) -> Option<i32> {
        self.inner.next()
    }
}

pub fn fib() -> Fibonacci {
    Fibonacci {
        inner: Unfold::new((1, 1), |st| {
            let (a, b) = *st;
            *st = (b, a + b);
            Some(a)
        })
    }
}

顺便说一下,我还修了几个尼特:

  • 正如Chris Morgan所说,使用'static作为生命周期更清楚。

  • int(又名isize)不应该在这里使用,因为Fibonacci序列不依赖于指针的大小。我将其更改为更惯用的i32