我有一个以下形式的构造:
pub enum Value {
Nil,
Str(String),
Seq(Vec<Value>),
}
A Value
为 null、字符串或其他向量Value
s,然后可以是这三个选项中的任何一个。
我想创建一个方法来延迟迭代每个String
in a Value
,尊重嵌套。我的第一次尝试看起来像这样:
#![feature(generators)]
#![feature(generator_trait)]
use std::ops::{Generator, GeneratorState};
use std::pin::Pin;
fn gen_to_iter<G>(g: G) -> impl Iterator<Item = G::Yield>
where
G: Generator<Return = ()> + Unpin,
{
struct It<G>(G);
impl<G: Generator<Return = ()> + Unpin> Iterator for It<G> {
type Item = G::Yield;
fn next(&mut self) -> Option<Self::Item> {
match Pin::new(&mut self.0).resume() {
GeneratorState::Yielded(y) => Some(y),
GeneratorState::Complete(()) => None,
}
}
}
It(g)
}
pub enum Value {
Nil,
Str(String),
Seq(Vec<Value>),
}
impl Value {
pub fn iter_over<'a>(&'a self) -> impl Iterator<Item = &'a String> {
let closure = move || match *self {
Value::Nil => {}
Value::Str(ref s) => {
yield s;
}
Value::Seq(ref vs) => {
for v in vs {
for i in v.iter_over() {
yield i;
}
}
}
};
gen_to_iter(closure)
}
}
fn main() {
let val = Value::Seq(vec![Value::Str("test".to_string())]);
for s in val.iter_over() {
println!("{}", s);
}
}
()
运行上面的代码时,我收到有关递归类型的编译器错误,因为我正在调用iter_over
在另一个电话中iter_over
:
error[E0720]: opaque type expands to a recursive type
--> src/main.rs:34:39
|
34 | pub fn iter_over<'a>(&'a self) -> impl Iterator<Item = &'a String> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `gen_to_iter::It<[generator@src/main.rs:35:23: 47:10 self:&'a Value for<'r, 's, 't0, 't1, 't2, 't3, 't4, 't5, 't6, 't7, 't8, 't9, 't10, 't11, 't12, 't13, 't14, 't15, 't16, 't17> {&'r Value, Value, &'s std::string::String, &'t0 std::string::String, (), &'t1 std::vec::Vec<Value>, fn(&'t2 std::vec::Vec<Value>) -> <&'t2 std::vec::Vec<Value> as std::iter::IntoIterator>::IntoIter {<&'t2 std::vec::Vec<Value> as std::iter::IntoIterator>::into_iter}, &'t3 std::vec::Vec<Value>, std::slice::Iter<'t4, Value>, std::slice::Iter<'t5, Value>, &'t6 Value, &'t7 Value, fn(impl std::iter::Iterator) -> <impl std::iter::Iterator as std::iter::IntoIterator>::IntoIter {<impl std::iter::Iterator as std::iter::IntoIterator>::into_iter}, &'t9 Value, &'t10 Value, impl std::iter::Iterator, impl std::iter::Iterator, impl std::iter::Iterator, &'t14 std::string::String, &'t15 std::string::String, &'t16 std::string::String, &'t17 std::string::String, ()}]>`
除了放弃懒惰的方法并仅使用向量之外,我似乎无法找到解决方法。我可以采取哪些潜在的途径?