rust - 预期的绑定(bind)生命周期参数,找到具体的生命周期

标签 rust

我无法计算出此代码的生命周期参数。我尝试的所有操作通常都会导致编译器错误:“预期的绑定(bind)生命周期参数 '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

最佳答案

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

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/

相关文章:

rust - 分配数据以传递给 FFI 调用的正确方法是什么?

generics - 是否可以为除了一个类型子集以外的所有类型都可以使用的特征创建通用的impl?

rust - 用 Hyper 显示响应体只显示响应体的大小

泛型类型的 Rust 约束 Item

arrays - 有没有一种简单的方法可以从数组中删除重复的元素?

rust - 转化 PhantomData 标记安全吗?

rust - 尝试使用Rust tokio Framed LinesCodec写入服务器

generics - 使用类似泛型构造的子类型

rust - Cap'n proto 的可变状态

rust - nom 解析器借用检查器问题