Кажется, что ключевая ошибка:
error[E0597]: `body` does not live long enough
--> src/lib.rs:85:15
|
85 | resp: body.lock().unwrap().clone(),
| ^^^^ borrowed value does not live long enough
...
89 | }
| - `body` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
То же самое для объекта заголовков.
Мне удалось получить упрощенное средство воспроизведения этого, потушив многоВаш код:
use std::sync::{Arc, Mutex};
pub struct Response {
resp: String,
headers: Vec<String>,
}
pub fn get(addr: &str) -> std::io::Result<Box<Response>> {
let headers: Vec<String> = Vec::with_capacity(10);
let headers = Arc::new(Mutex::new(headers));
let body = Arc::new(Mutex::new(String::with_capacity(1024)));
Ok(Box::new(Response {
resp: body.lock().unwrap().clone(),
headers: headers.lock().unwrap().clone(),
}))
}
Я думаю, что это связано с временами жизни временных переменных, созданных в окончательных возвращаемых значениях Ok(Box::new(...))
.
Мне удалось заставить его скомпилировать, потянув блокировку / развернуть снаружи.
let body = body.lock().unwrap();
let headers = headers.lock().unwrap();
Ok(Box::new(Response {
resp: body.clone(),
headers: headers.clone(),
}))
Из более полного объяснения, данного в Почему я получаю ", не получаетсяжить достаточно долго »в возвращаемом значении? Я обнаружил, что вы можете написать это как
return Ok(Box::new(Response {
resp: body.lock().unwrap().clone(),
headers: headers.lock().unwrap().clone(),
}));
, то есть добавив явную return
и завершающую точку с запятой.Хотя я чувствую себя неаккуратным, могу сказать, что это плохой стиль.