“借入的数据不能在其关闭之外存储”是什么意思?

Val*_*ntz 4 closures ownership rust borrow-checker

编译以下代码时:

fn main() {
    let mut fields = Vec::new();
    let pusher = &mut |a: &str| {
        fields.push(a);
    };
}
Run Code Online (Sandbox Code Playgroud)

编译器给我以下错误:

fn main() {
    let mut fields = Vec::new();
    let pusher = &mut |a: &str| {
        fields.push(a);
    };
}
Run Code Online (Sandbox Code Playgroud)

此错误是什么意思,我该如何修复我的代码?

She*_*ter 5

它的意思完全是这样:您借用的数据仅在关闭期间有效。尝试将其存储在闭包之外会使代码面临内存不安全的危险。

出现这种情况是因为推断的闭包参数的生存期与存储在中的生存期无关Vec

通常,这不是您遇到的问题,因为某些事情导致了更多类型推断的发生。在这种情况下,您可以fields向闭包中添加类型并将其从闭包中删除:

let mut fields: Vec<&str> = Vec::new();
let pusher = |a| fields.push(a);
Run Code Online (Sandbox Code Playgroud)