可变载体中参考的生命期

时间:2016-09-07 01:50:31

标签: rust lifetime

我的算法如下:

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的生命周期更长。我该如何解决这个问题?

1 个答案:

答案 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);

可能稍微有点效率。