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

4
我写了一个函数,它返回一个迭代器,列出所有的斐波那契数列:
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
将Wrap Unfold封装在实现Iterator的结构体中。有一些计划允许impl Iterator<T>作为返回类型,这对于实现Iterator的任何类型都是有效的,但我们还没有到那里。 - A.B.
你所写的代码并不会按照你想要的方式执行,因为'a是静态的。 - Chris Morgan
@A.B.:有关这些计划的邮件列表线程/RFC吗?听起来很有趣。 - rp123
1
@reinerp,有一份RFC,但它已经关闭了,因为有一个更好的RFC尚未编写。 - Vladimir Matveev
@ChrisMorganпјҡз”ұдәҺжҺЁж–ӯзҡ„еҸҳеҢ–пјҢиҮӘжң¬е‘Ёиө·пјҢд»»ж„Ҹз”ҹе‘Ҫе‘Ёжңҹзҡ„'aе°ҶжҜ”'staticжӣҙеҘҪең°иҝӣиЎҢжҺЁж–ӯгҖӮ - bluss
显示剩余3条评论
1个回答

2
正如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)不应在此处使用,因为斐波那契数列不依赖于指针的大小。我将其更改为更符合惯用法的i32


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接