我设法再次遇到一个终身问题,我似乎无法自行解决。
编译器告诉我无法推断自动强制的适当生命周期
我尝试遵循编译器建议并在handle_request
方法中引入了生命周期注释。
fn handle_request<'a>(&self, req: &Request, res: &'a mut ResponseWriter) {
fn set_headers(req: &Request, res: &mut ResponseWriter) {
//probably not important for the example
}
match &req.request_uri {
&AbsolutePath(ref url) => {
match self.router.match_route(req.method.clone(), url.clone()) {
Some(route_result) => {
set_headers(req, res);
let floor_req = request::Request{
origin: req,
params: route_result.params.clone()
};
let floor_res = response::Response{
origin: res
};
(route_result.route.handler)(floor_req, &mut floor_res);
},
None => {}
}
},
_ => set_headers(req, res)
}
}
我之前有代码工作但现在我想将http::server::ResponseWriter
包装在我自己的Response
结构中。我之前对Request
做了完全相同的事情,但就生命周期而言,情况似乎略有不同。也许是因为它只是&mut
,而不仅仅是一个简单的&
引用。
这是我的 ResponseWriter
结构。
use http;
///A container for the response
pub struct Response<'a> {
///the original `http::server::ResponseWriter`
pub origin: &'a mut http::server::ResponseWriter<'a>,
}
只是想让任何Samaritan想要在本地编译代码,我将其推入 lifetime_crazyness 分支:https://github.com/cburgdorf/Floor/commits/lifetime_craziness
只需运行make floor
即可进行编译。
答案 0 :(得分:10)
好的,所以我下载了你的代码来尝试编译它。实际上,如果我们看一下你的Response
结构的定义,我们就会看到:
pub struct Response<'a> {
///the original `http::server::ResponseWriter`
pub origin: &'a mut http::server::ResponseWriter<'a>,
}
从编译器的角度来看,这个定义声称指向http::server::ResponseWriter
的指针的生命周期与<{1}}内的生命周期相同。我没有看到任何特殊原因,为什么这应该是真的,看起来编译器也不能。因此,要修复它,您需要引入另一个生命周期参数,以便您可以确定生命周期是不同的:
http::server::ResponseWriter
以下是PR中的修复方法:https://github.com/BurntSushi/Floor/commit/127962b9afc2779c9103c28f37e52e8d292f9ff2