我正在尝试移植这个 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/