当前位置: 首页 > 知识库问答 >
问题:

预期绑定寿命参数,找到具体寿命

陈业
2023-03-14

我无法计算出这段代码的生存期参数。我所尝试的一切通常都会导致编译器错误:“预期的绑定生存期参数'a,找到了具体的生存期”或者类似于“考虑使用所示的显式生存期参数”(所示的示例没有帮助)或“与trait不兼容的方法”。

请求响应操作都是简化版本,以尽量减少此示例。

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");
}

铁锈游乐场

共有1个答案

解修然
2023-03-14

你的特质函数定义如下:

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定义不匹配。

以下是您需要的:

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

 类似资料:
  • 我正在尝试在结构中存储函数: 编译器抱怨:

  • 虽然下面的代码是一个早期的原型,对于我在这个阶段如何实现协议缓冲区不必太认真,但我无法理解rust编译器给我带来的错误消息指的是什么。 src\main。rs:89:9:89:36错误:解决的类型不匹配

  • 我有一个问题与生命周期参数的结构。我不能100%确定如何描述这个问题,但是我创建了一个显示编译时错误的简单案例。 我得到的错误是 我尝试了很多变体,只是无法编译这个东西。我在这里找到了另一个帖子(如何修复:预期的具体寿命,但找到了绑定的寿命参数),但似乎绕过了问题,而不是解决它。我真的不明白为什么这个问题会出现。该 有什么想法吗?谢谢你的帮助。

  • 关于这个主题已经有很多线程,但是我看不出讨论的问题是否适用于我的特定问题。 我有一个存储和函数的结构。简而言之,问题是这样的: 我想做的是存储一个与名称相关联的回调函数(将来可能会有更多内容)。 但当我尝试这样使用这段代码时: 我得到以下错误消息: 我试着像这样内联闭包 但是我又犯了一个错误 我相信我明白为什么我会这样。 在切换到一个函数引用以存储在我的命令结构中之前,我尝试使用一个通用类型参数,

  • 我目前正在听这个。我试图把它缩小到一个最小的可重复的例子。 这给我留下了: 以前,我将我的存储在像这样的中 但是现在我想重构一些东西,并引入了一个结构,并将东西存储为

  • Sonarqube服务器7.0版(构建36138) Sonarqube分支插件7.0(构建413) Sonarqube已经建立了一个主分支机构。 作为Jenkins构建作业的一部分,我们执行以下命令: 其中BRANCH设置为我们在Jenkins构建的分支名称。 [信息]分支名称:发展,类型:短命 这使我相信,发展并没有被认为是一个长期存在的分支。 2)在问题选项卡中没有输出。只有代码选项卡显示任何