我的算法如下:
let seed: Foo = ...
let mut stack: Vec<&Foo> = Vec::new();
stack.push(&seed);
while let Some(next) = stack.pop {
let more_foos: Vec<Foo> = some_function_of(next) // 0 to many Foos returned
for foo in more_foos {
stack.push(&foo);
}
}
我收到foo
活不够久的错误。我认为这是因为stack
的生命周期更长。我该如何解决这个问题?
答案 0 :(得分:3)
more_foos
并在while let
循环的每次迭代结束时删除其内容。但是,您尝试在more_foos
中存储stack
中的项目的引用,并且这些项目无效,因为这会导致悬空指针。
相反,您应该改为stack
拥有Foo
个对象。
fn main() {
let seed: Foo = unimplemented!();
let mut stack: Vec<Foo> = Vec::new();
stack.push(seed);
while let Some(next) = stack.pop() {
let more_foos: Vec<Foo> = unimplemented!();
for foo in more_foos {
stack.push(foo);
}
}
}
注意:for
循环可以替换为:
stack.extend(more_foos);
可能稍微有点效率。