【问题标题】:Recursive generator in RustRust 中的递归生成器
【发布时间】:2020-02-09 19:52:58
【问题描述】:

我正在尝试使用rust generators 和此generator-to-iterator wrapper 将此python prime number generator 移植到生锈。

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

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 的回答,我终于能够在 rust 中实现a working version of the prime number generator

【问题讨论】:

    标签: recursion rust generator


    【解决方案1】:

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

    这可以通过使用盒装 trait 对象来解决 - Box&lt;Iterator&lt;Item=u64&gt;&gt; 在这里工作得很好并避免了这个问题。

    要么调整recursive_generator 以返回Box&lt;Iterator&lt;Item=u64&gt;&gt;,要么更改递归调用的行以仅针对该递归情况使用装箱迭代器。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2021-09-27
    • 2015-12-23
    • 2012-05-03
    • 1970-01-01
    • 2019-08-25
    • 2021-05-22
    相关资源
    最近更新 更多