我编写了一个返回迭代器的函数,该迭代器列出了所有斐波那契数字:
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)
。隐藏这些内部构件有哪些选择?
答案 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
。