При рассмотрении Как мне установить переменные Arc и Mutexed? , я столкнулся с проблемой, когда код, который выглядит нормально, генерирует ошибку "не хватает времени" при создании возвращаемого значения из Mutex
.Простое извлечение доступа lock().unwrap()
из возвращаемого объекта устраняет ошибку - но я бы хотел понять, почему в этом случае Rust жалуется на проблему с пожизненным сроком.
Мне удалось сократить код доочень простое средство воспроизведения: первая функция компилирует OK, вторая генерирует сообщение об ошибке, и они почти идентичны.
use std::sync::Mutex;
pub struct Response {
resp: String,
}
pub fn get() -> Response {
let body = Mutex::new("a".to_string());
let x: std::sync::MutexGuard<_> = body.lock().unwrap();
Response { resp: x.clone() }
}
pub fn get2() -> Response {
let body = Mutex::new("a".to_string());
Response {
resp: body.lock().unwrap().clone(),
}
}
error[E0597]: `body` does not live long enough
--> src/lib.rs:16:15
|
16 | resp: body.lock().unwrap().clone(),
| ^^^^ borrowed value does not live long enough
17 | }
18 | }
| - `body` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created