预期的边界生命周期参数,发现具体的生命周期

17

我无法弄清楚这段代码的生命周期参数。无论我尝试什么,通常都会导致编译器错误:“期望绑定生命周期参数 '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");
}

Rust Playground

1个回答

15
您的特征函数定义如下:

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>;或者,“对于所有 'aT 必须满足 Fn(Request, Response<'a>) -> Action<'a>。”请注意保留 HTML 标签,但不要添加解释,并使翻译内容更加通俗易懂。

9
在《Rust Book》中,“for<”没有出现过,而在编译器中(排除测试),它只被使用了33次。难怪我以前没见过它。如果有人对此有疑问,我能找到的唯一文档是该RFC - Veedrac
哦,RFC指出括号表示法将省略所有内容:http://is.gd/fdy0M7。 - Veedrac
3
是的,对于<>来说,这几乎是我没有记录的最后一件事了。 - Steve Klabnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接