recursion - Rust 中的递归生成器

标签 recursion rust generator

我正在尝试移植这个 python prime number generator使用 rust generators 使用rust 还有这个generator-to-iterator wrapper .

我的问题是原来的实现是递归的,我没有设法通过以下错误:

error[E0720]: opaque type expands to a recursive type
  --> src/main.rs:27:29
   |
27 | fn recursive_generator() -> impl Iterator<Item = u64> {
   |                             ^^^^^^^^^^^^^^^^^^^^^^^^^ expands to a recursive type
   |
   = note: expanded type is `GeneratorToIterator<[generator@src/main.rs:28:25: 
   48:6 {u64, (), impl std::iter::Iterator}]>`

下面是产生这个错误的递归生成器的实现:


fn recursive_generator() -> impl Iterator<Item = u64> {
    GeneratorToIterator(move || {
        // Yield a few values
        yield 1;
        yield 2;
        yield 3;

        // Initialize the inner generator
        let mut inner_value: u64 = 0;
        let mut inner_generator = recursive_generator();

        // Get the first value of the inner generator
        match inner_generator.next(){
             Some(x) => inner_value += x,
             None => {},
        }

        // Yield some other values
        yield 4;
        yield 5;
        yield 6;
    })
}

可以找到完整的实现(使用 GeneratorToIterator 定义)here .

我找到了这个 related question但我没有设法编译他们的 gen_to_iter 函数。

编辑:感谢@bluss 的回答,我终于能够实现 a working version of the prime number generator使用rust 了。

最佳答案

错误explanation E0720提到 impl Trait类型必须扩展为不包含其他 impl Trait 的类型类型,但这里的类型当然是递归的,因为这就是重点。

这可以通过使用盒装特征对象来解决 - Box<Iterator<Item=u64>>在这里工作得很好并且避免了这个问题。

要么调整recursive_generator返回 Box<Iterator<Item=u64>> ,或更改递归调用行以仅针对该递归情况使用盒装迭代器。

关于recursion - Rust 中的递归生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58355602/

相关文章:

java - 如何生成半随机颜色列表?

java - 递归调用中的执行顺序

testing - 在文档测试中使用本地模块时出错

python - 如何修改 Python 中的生成器?

rust - 使用生命周期参数为特征分离可变借位

enums - 如果将枚举变体传递给函数,如何产生编译时错误

python - 带 yield 的递归函数不返回任何东西

java - 你如何实现递归?

c++ - 从递归向后选择排序函数调用 max 和 swap 函数

c++ - 给定一个素数列表和一个因式分解模式,如何构造其素数分解与给定模式匹配的所有数字?