我无法计算出此代码的生命周期参数。我尝试的所有操作通常都会导致编译器错误:“预期的绑定(bind)生命周期参数 'a
,找到了具体的生命周期”或类似“考虑使用所示的显式生命周期参数”之类的东西(并且显示的示例没有帮助)或“与特征不兼容的方法”。
Request
、Response
和 Action
是简化版本,以尽量减少此示例。
struct Request {
data: String,
}
struct Response<'a> {
data: &'a str,
}
pub enum Action<'a> {
Next(Response<'a>),
Done,
}
pub trait Handler: Send + Sync {
fn handle<'a>(&self, req: Request, res: Response<'a>) -> Action<'a>;
}
impl<'a, T> Handler for T
where
T: Send + Sync + Fn(Request, Response<'a>) -> Action<'a>,
{
fn handle(&self, req: Request, res: Response<'a>) -> Action<'a> {
(*self)(req, res)
}
}
fn main() {
println!("running");
}
最佳答案
你的特征函数定义是这样的:
fn handle<'a>(&self, req: Request, res: Response<'a>) -> Action<'a>;
请注意 'a
由调用者指定,可以是任何东西,不一定与 self
相关联以任何方式。
你的特征实现定义是这样的:
fn handle(&self, req: Request, res: Response<'a>) -> Action<'a>;
'a
在这里不是由调用者指定的,而是与您正在为其实现特征的类型相关联。因此特征实现与特征定义不匹配。
这是你需要的:
trait Handler: Send + Sync {
fn handle<'a>(&self, req: Request, res: Response<'a>) -> Action<'a>;
}
impl<T> Handler for T
where
T: Send + Sync + for<'a> Fn(Request, Response<'a>) -> Action<'a>,
{
fn handle<'a>(&self, req: Request, res: Response<'a>) -> Action<'a> {
(*self)(req, res)
}
}
关键点是T
中的变化绑定(bind):for<'a> Fn(Request, Response<'a>) -> Action<'a>
.这意味着:“给定一个任意的生命周期参数 'a
, T
必须满足 Fn(Request, Response<'a>) -> Action<'a>
;或者,“T
必须,对于所有'a
, 满足 Fn(Request, Response<'a>) -> Action<'a>
.
关于rust - 预期的绑定(bind)生命周期参数,找到具体的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194367/