繁体   English   中英

预期的约束寿命参数,找到具体的寿命

[英]Expected bound lifetime parameter, found concrete lifetime

我无法弄清楚这段代码的生命周期参数。 我尝试的所有内容通常会导致编译器错误:“预期的绑定生命周期参数'a ,找到具体的生命周期”或类似“考虑使用显示的显式生命周期参数”(并且显示的示例没有帮助)或“方法不兼容”特质“。

RequestResponseAction是简化版本,以使此示例保持最小。

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界限的变化: for<'a> Fn(Request, Response<'a>) -> Action<'a> 这意味着:“给定一个任意的生命周期参数'aT必须满足Fn(Request, Response<'a>) -> Action<'a> ; 或者,“ T必须,对于所有'a ,满足Fn(Request, Response<'a>) -> Action<'a>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM