我正在尝试在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::leak
和lazy_static
)都有效。非常感谢评论作者!我一开始选择了lazy_static
,然后我重构了,最后使用了另一个性能更高的crate (rgeo),它不需要这样的技巧。
所以我的问题的答案是:这里的一般解决方案是增加loc
的寿命,使其成为'static
。