【问题标题】:Expected bound lifetime parameter, found concrete lifetime预期绑定寿命参数,找到具体寿命
【发布时间】:2015-11-18 14:08:00
【问题描述】:

我无法确定此代码的生命周期参数。我尝试的一切通常都会导致编译器错误:“预期绑定的生命周期参数'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

【问题讨论】:

    标签: rust


    【解决方案1】:

    你的特征函数定义是这样的:

    fn handle<'a>(&self, req: Request, res: Response<'a>) -> Action<'a>;
    

    请注意,'a 由调用者指定,可以是任何东西,不一定以任何方式与self 绑定。

    你的 trait 实现定义是这样的:

    fn handle(&self, req: Request, res: Response<'a>) -> Action<'a>;
    

    'a 在这里不是由调用者指定的,而是与您正在为其实现特征的类型相关联。因此 trait 实现与 trait 定义不匹配。

    这是你需要的:

    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&lt;'a&gt; Fn(Request, Response&lt;'a&gt;) -&gt; Action&lt;'a&gt;。这意味着:“给定任意生命周期参数'aT 必须满足Fn(Request, Response&lt;'a&gt;) -&gt; Action&lt;'a&gt;;或者,“对于所有'aT 必须满足Fn(Request, Response&lt;'a&gt;) -&gt; Action&lt;'a&gt;

    【讨论】:

    • "for&lt;" 在 The Rust Book 中出现 0 次,在编译器中总共使用(不包括测试)33 次。难怪我以前没见过。如果有人想知道它们,我能找到的唯一文档是the RFC
    • 哦,RFC 指出括号符号无论如何都会忽略它:is.gd/fdy0M7
    • 是的,for 几乎是我没有记录的最后一件事。
    猜你喜欢
    • 2015-09-30
    • 2018-08-28
    • 1970-01-01
    • 2023-04-07
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多