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

时间:2018-06-30 19:48:18

标签: rust closures borrow-checker ownership

编译以下代码时:

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

编译器给我以下错误:

error: borrowed data cannot be stored outside of its closure
 --> src/main.rs:4:21
  |
3 |     let pusher = &mut |a: &str| {
  |         ------        --------- ...because it cannot outlive this closure
  |         |
  |         borrowed data cannot be stored into here...
4 |         fields.push(a);
  |                     ^ cannot be stored outside of its closure

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

1 个答案:

答案 0 :(得分:5)

它的确切含义是:借用的数据仅在关闭期间有效。尝试将其存储在闭包之外会使代码暴露于内存安全中。

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

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

let mut fields: Vec<&str> = Vec::new();
let pusher = |a| fields.push(a);