Что означает «заимствованные данные не могут храниться за пределами их закрытия»? - PullRequest
0 голосов
/ 30 июня 2018

При компиляции следующего кода:

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 голосов
/ 30 июня 2018

Это означает именно то, что в нем говорится: данные, которые вы заимствуете, живут только на время закрытия. Попытка сохранить его вне замыкания может привести к небезопасной памяти в коде.

Это происходит потому, что предполагаемое время жизни аргумента замыкания не имеет отношения к временам жизни, хранящимся в Vec.

Как правило, это не проблема, с которой вы сталкиваетесь, потому что что-то вызвало появление большего числа типов. В этом случае вы можете добавить тип к fields и удалить его из замыкания:

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