如何修复:无法推断自动强制的适当生命周期

时间:2014-06-18 17:02:14

标签: rust lifetime

我设法再次遇到一个终身问题,我似乎无法自行解决。

编译器告诉我无法推断自动强制的适当生命周期

enter image description here

我尝试遵循编译器建议并在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即可进行编译。

1 个答案:

答案 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