Я застрял, пытаясь разделить (только для чтения) структуры данных между асинхронными помощниками. Я пытаюсь создать Hyper-сервер, на котором я предварительно генерирую некоторые данные, которые могут использоваться всеми обработчиками запросов.
Вот пример из руководства по началу работы с Hyper, дополненный тем, что я пытаюсь сделать:
#[tokio::main]
async fn main() {
let address = SocketAddr::from(([127, 0, 0, 1], 3000));
let pages = generate_static_pages();
let make_service = make_service_fn(|_conn| async move {
Ok::<_, Infallible>(service_fn(|req: Request<Body>| async move {
serve(pages, req)
}))
});
let server = Server::bind(&address).serve(make_service);
if let Err(error) = server.await {
eprintln!("server error: {}", error);
}
}
В моем случае generate_static_pages()
возвращает HashMap<&'static str, Bytes>
с предварительно созданными страницами. К сожалению, эту хеш-карту нельзя сгенерировать во время компиляции, потому что это значительно упростит задачу. Теперь я борюсь, потому что pages
не может быть заимствован закрытием: "не может выйти из pages
, захваченной переменной в FnMut
замыкании"
Я попытался передать ссылку, но это не сработало, потому что Rust не может сделать вывод, что переменная живет достаточно долго, чтобы можно было использовать замыкание. Затем я попытался использовать .clone()
, но это не сработало, потому что он будет вызываться для переменной после ее перемещения, а это невозможно. Наконец, я попытался обернуть Arc
, но это не решило проблему, в основном по той же причине.
Что бы вы посоветовали мне сделать? Спасибо!