移到闭包中的结构从外部借用引用



我正在尝试在Rust中开发一个非常简单的REST API,使用warp和Rust Reverse Geocoder。我有以下代码:

#[tokio::main]
async fn main() -> Result<()> {
let loc = reverse_geocoder::Locations::from_memory();
let geocoding = Arc::new(reverse_geocoder::ReverseGeocoder::new(&loc));
let sample = warp::get()
.and(warp::path("loc"))
.map(move || format!("{}", geocoding.search((42.0, 42.0)).unwrap().record));
warp::serve(sample)
.run(([127, 0, 0, 1], 3030))
.await;
Ok(())
}

编译器抱怨loc被借用了,但是存活的时间不够长。我理解为什么(值在main函数的末尾被删除,但仍然在闭包中引用),但我找不到一种方法来解决这个问题。

ReverseGeocoder借用了Locations字段,而不是Clone,因此我将其包装在Arc中以正确移动它。我没有办法让ReverseGeocoder拥有Locations

我的问题很简单:我怎么能使loc活得足够长,使这段代码编译?

提前感谢!

在评论中提出的三个解决方案(once_cell,Box::leaklazy_static)都有效。非常感谢评论作者!我一开始选择了lazy_static,然后我重构了,最后使用了另一个性能更高的crate (rgeo),它不需要这样的技巧。

所以我的问题的答案是:这里的一般解决方案是增加loc的寿命,使其成为'static

最新更新