Я хочу удержать замыкание &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()
}
}
- Почему
call_mut
fn должен использовать 'b
время жизни вместо'a
? - Я обнаружил, что код будет работать, если изменить
data: &mut Vec<i32>
на data: &Vec<i32>
, что меня больше смущает, почему время жизни связано с mut
?