Rust 使用绑定生存期处理异步/未来响应?

Rust 使用绑定生存期处理异步/未来响应?,rust,lifetime,actix-web,Rust,Lifetime,Actix Web,使用这个最小的异步actixweb服务器 使用actix_web::{http,server,App,HttpRequest,HttpResponse,Error};//v0.7.19 使用futures::Future;//v0.1.28 ///一种异步响应,它将在外部'Result'上“快速失败”,或 ///返回一个可能成功或失败的未来 ///lifetime参数是必需的,用于指示未来无法生存 ///处理程序(`handle\u request`)的参数--`req:&HttpRequest

使用这个最小的异步actixweb服务器

使用actix_web::{http,server,App,HttpRequest,HttpResponse,Error};//v0.7.19
使用futures::Future;//v0.1.28
///一种异步响应,它将在外部'Result'上“快速失败”,或
///返回一个可能成功或失败的未来
///lifetime参数是必需的,用于指示未来无法生存
///处理程序(`handle\u request`)的参数--`req:&HttpRequest`
键入AsyncResponse,错误>;
///生命已被省略,但在这里,未来将与之相应`
///将具有与'req`HttpRequest相同的生存期
fn handle_请求(请求:&HttpRequest)->异步响应{
//处理请求
Ok(Box::new(futures::future::Ok(HttpResponse::Ok().body(“Hello World”)))
}
fn main(){
//actix web服务器的实例化
服务器::新建(移动| |{
App::new()
.资源(“/”,|r|{
r、 方法(http::method::GET).f(| r:&HttpRequest | handle|u请求(r))
})
});
}
编译失败,原因是


错误[E0495]:由于需求冲突,无法为函数调用中的生存期参数推断适当的生存期
-->src/main.rs:23:69
|
23 | r.method(http::method::GET).f(| r:&HttpRequest | handle_请求(r))
|                                                                     ^^^^^^^^^^^^^^^^^
|
注意:首先,生命周期不能超过23:47在身体上定义的匿名生命周期#2。。。
-->src/main.rs:23:47
|
23 | r.method(http::method::GET).f(| r:&HttpRequest | handle_请求(r))
|                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
注意:…这样引用就不会超过借用的内容
-->src/main.rs:23:84
|
23 | r.method(http::method::GET).f(| r:&HttpRequest | handle_请求(r))
|                                                                                    ^
=注意:但是,生存期必须对静态生存期有效。。。
=注意:…以便类型兼容:
应为actix_web::handler::Responder
找到actix_web::handler::Responder
actix web中
f
的定义是

///设置处理程序函数。通常对该方法的调用是最后一次调用
///在路由配置期间,它不会返回对self的引用。
发布fn f(&mut self,处理程序:f)
哪里
F:Fn(&HttpRequest)->R+'静态,
R:应答器+'静态,
{
self.handler=InnerHandler::new(handler);
}
我是否正确理解编译失败是因为

  • f
    的定义要求处理程序
    f
    返回一个具有
    静态
    生存期的响应
  • 当给定处理程序
    handle\u请求
    返回的响应的生存期绑定到
    HttpRequest
    参数的生存期时

我能做些什么来解决这个问题,而不改变
异步应答的定义吗?

如果您键入
fn handle\u请求,它能工作吗AsyncCResponse@FrenchBoiethios不。实际上(寿命)省略的版本与您建议的完全相同(单个ref参数)1.我认为你不能随心所欲。func返回的
响应程序
必须绑定到静态生存期,而
异步响应
则不绑定。我不知道为什么Actix中会有这样的限制,但是如果不改变
AsyncResponse@ÖmerErden的定义,我就找不到合适的解决方案,并重新设计了整个过程。非常有趣的是,actix web 1.0现在在其句柄中传递值而不是引用。如果键入
fn handle\u请求,它能工作吗AsyncCResponse@FrenchBoiethios不。实际上(终身)省略的版本与您建议的完全相同(单个ref参数)。我认为您不能做您想做的事情。func返回的
响应程序
必须绑定到静态生存期,而
异步响应
则不绑定。我不知道为什么Actix中会有这样的限制,但是如果不改变
AsyncResponse@ÖmerErden的定义,我就找不到合适的解决方案,并重新设计了整个过程。有趣的是,actix web 1.0现在在其处理程序中传递值而不是引用