我正在尝试使用warp和Rust Reverse Geocoder在Rust中开发一个非常简单的REST API。我有以下代码:
#[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
。
关于rust - 移入封闭的结构从外部借用了引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66569782/