Почему этот ржавый закрывающий код FnMut имеет ошибки времени жизни? - PullRequest
1 голос
/ 29 сентября 2019

Я хочу удержать замыкание &mut Vec, но эти простые несколько строк кода не могут скомпилироваться.

Я знаю, что это можно решить с помощью RefCell, я просто не могу понятьошибка:

struct Server<'a> {
    data: &'a mut Vec<i32>,
}

fn main() {
    let mut data = vec![1, 2, 3];
    let mut c = || {
         Server{
            data: &mut data,
        }
    };
    let server = c();
}

Rust link link

Сообщение об ошибке:

error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
  --> src/main.rs:36:19
   |
36 |             data: &mut data,
   |                   ^^^^^^^^^
   |
note: first, the lifetime cannot outlive the lifetime '_ as defined on the body at 34:17...
  --> src/main.rs:34:17
   |
34 |     let mut c = || {
   |                 ^^
note: ...so that closure can access `data`
  --> src/main.rs:36:19
   |
36 |             data: &mut data,
   |                   ^^^^^^^^^
note: but, the lifetime must be valid for the call at 39:18...
  --> src/main.rs:39:18
   |
39 |     let server = c();
   |                  ^^^
note: ...so type `Server<'_>` of expression is valid during the expression
  --> src/main.rs:39:18
   |
39 |     let server = c();
   |                  ^^^

error: aborting due to previous error

Обновление:

Я нашел этот пост ответил на вопрос, но я не мог понять некоторые его части:

Оказывается, возвращение & 'a mut i32 невозможно для более короткого жизненного вызова call_mut.То, что мы действительно хотели для типа возврата call_mut, было что-то вроде:

impl<'a> FnMut<(usize,)> for Closure<'a> {
    extern "rust-call"
    fn<'b> call_mut(&'b mut self, (i,): (usize, )) -> &'b mut i32 {
        self.inner.get_mut(i).unwrap()
    }
}
  1. Почему call_mut fn должен использовать 'b время жизни вместо'a?
  2. Я обнаружил, что код будет работать, если изменить data: &mut Vec<i32> на data: &Vec<i32>, что меня больше смущает, почему время жизни связано с mut?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...