如何使用结构和实现的生命周期来推断实现的适当生命周期?

2024-01-09

我该如何解决这个错误?当我在中使用“匿名生命周期”时,我究竟在告诉编译器什么?impl?

struct LineHandlerInfo<'a> {
    label: &'a str,
    match_literal: &'a str,
    f: fn(&str) -> Option<&str>,
}

struct Game<'a> {
    handlers: Vec<LineHandlerInfo<'a>>,
}

impl Game<'_> {
    fn match_str<'a>(
        &'a mut self,
        label: &'a str,
        match_literal: &'a str,
        mut f: fn(&str) -> Option<&str>,
    ) {
        let mut lh = LineHandlerInfo {
            label,
            match_literal,
            f,
        };
        self.handlers.push(lh);
    }
}

fn main() {
    let mut g = Game {
        handlers: Vec::new(),
    };
    g.match_str("echo hello", "hello", |s| {
        println!("{}", s);
        None
    });
}

当我尝试编译时,出现以下错误:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
  --> src/main.rs:18:22
   |
18 |         let mut lh = LineHandlerInfo {
   |                      ^^^^^^^^^^^^^^^
   |
note: first, the lifetime cannot outlive the lifetime 'a as defined on the method body at 12:18...
  --> src/main.rs:12:18
   |
12 |     fn match_str<'a>(
   |                  ^^
note: ...so that reference does not outlive borrowed content
  --> src/main.rs:19:13
   |
19 |             label,
   |             ^^^^^
note: but, the lifetime must be valid for the lifetime '_ as defined on the impl at 11:11...
  --> src/main.rs:11:11
   |
11 | impl Game<'_> {
   |           ^^
   = note: ...so that the expression is assignable:
           expected LineHandlerInfo<'_>
              found LineHandlerInfo<'_>

如何解决此错误以及当我指定生命周期时我到底告诉编译器什么impl Game当我已经在结构上拥有了生命周期时?


如何解决此错误?当我在 impl Game 上指定生命周期且结构体已经有生命周期时,我究竟要告诉编译器什么?

我怀疑您的困惑源于对 Rust 中声明和使用生命周期的方式的不完全理解。

结构生命周期

为了在结构上使用生命周期,您declare里面的生命周期<>与您要声明的结构的名称相邻,然后refer到结构定义中的生命周期。重要的是,请注意,此处声明的生命周期仅限于结构定义 - 它在外部没有任何意义。

例如(使用@Shepmaster提供的MRE):

struct Game<'a> {
    handlers: Vec<&'a str>,
}

结构体Game包含对字符串的引用向量,并且引用的字符串必须至少与Game struct.

实现生命周期

在 impl 块上使用生命周期说明符时,您declare里面的生命周期<>紧邻 impl 关键字,之后您可以refer到正在实现的结构体和实现本身内部的生命周期,如下所示:

impl<'b> Game<'b> {
    fn match_str(&mut self, label: &'b str) {
        self.handlers.push(label);
    }
}

请注意,我在这里使用了完全不同的生命周期名称('b) 来说明结构体上的生命周期声明独立于 impl 块上的生命周期声明。

分解一下:

impl<'b>

这意味着我们正在定义结构体的实现,并且在该定义中我们将使用生命周期'b

 Game<'b> {

这意味着 impl 用于结构体Game与一生'b-所以任何参考self在这个实现中将自动具有生命周期'b以及。

fn match_str(&mut self, label: &'b str) {

这里我们定义方法match_str这需要一个参数label. label是一个字符串切片,它也有生命周期'b- 所以它必须至少持续self该方法被调用。

在你的原始代码中,你有这样的东西:

impl Game<'_> {
    fn match_str<'a>(&mut self, label: &'a str) {
    ...
    }
}

这是告诉编译器:

  • 您正在启动一个新的 impl 块,并且在 impl 级别没有声明生命周期
  • 该实现是针对结构的Game;这个结构有一个生命周期参数,但我们不关心它,也不会将它与实现的任何元素联系起来
  • 我们正在定义一个方法match_str,我们宣布一生'a我们可以在函数签名的其余部分中引用它
  • 我们有一个争论label哪个有寿命a,但我们不会将这一生与其他任何事情联系起来

更多信息:

  • Rust Book - 结构定义中的生命周期注释 https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-annotations-in-struct-definitions
  • Rust Book - 方法定义中的生命周期注释 https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-annotations-in-method-definitions
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用结构和实现的生命周期来推断实现的适当生命周期? 的相关文章

随机推荐

  • 具有drive.file范围的更改源的预期行为是什么?

    我的期望是 如果我查询范围为drive file 的更改源 我将仅收到对我的应用程序拥有的文件的更改 然而 在我所做的测试中 我发现提要中的文件与我的应用程序无关 至少其中一些是与我共享的文件 有人确切知道这应该如何工作吗 Edit 0 类
  • 如果“mousemove”和“click”事件同时触发怎么办?

    不知道是否只是Chrome问题 现在无法检查 但是让我们尝试下面的代码 我们将两个事件绑定到某个元素 div on mousemove function e console log move click function e console
  • Windows cmd - 使用 oneliner 与用户输入提示 [npm] 交互

    我正在尝试将输入作为一行传递给用户输入提示 但很难弄清楚如何正确执行此操作 具体来说 我正在尝试使用登录到 npmnpm adduser npm login是它的别名 当它是一个奇异值时 它可以工作 但这只能让我到目前为止 echo exa
  • SiteCatalyst:跟踪 Webkit 浏览器上的自定义链接

    我的查询是我有一个重定向到另一个页面的链接 在 webkit 浏览器中 如何强制 sitecatalyst 服务器调用 脚本执行 在重定向发生之前完成 我正在使用 sitecatalyst 作为门户 我有 配置自定义链接调用以包含 didA
  • 在可选参数中设置日期时间的默认值[重复]

    这个问题在这里已经有答案了 如何在可选参数中设置日期时间的默认值 public SomeClassInit Guid docId DateTime addedOn DateTime Now Init codes here 有一个解决方法 利
  • 如何在一行内遍历这个哈希值?

    哈希中的每个键都有一个值 该值也是哈希 100 gt 1 gt ruby 2 gt enumerables 50 gt 3 gt can 4 gt cause 15 gt 5 gt occassional 6 gt insanity 对于每
  • 正确关闭数据库连接 - VBScript + MS SQL

    我有一个连接到 SQL 服务器的经典 ASP vbscript Web 应用程序 在某些页面上 我打开多个数据库连接来提取数据 我的问题是 是在每个页面底部添加关闭连接功能更好 还是在使用后立即显式关闭连接更好 请记住 在这些特定页面上 每
  • Java 单元测试:替换被测私有方法

    运行 JUnit 测试时是否有任何方法可以替换私有方法中的逻辑 一些背景知识 我们有一些与 OSGi 容器内的包交互的私有方法 这在单元测试中不可用 因此该方法将失败 我们已经研究过 JMockIt 但方法替换功能似乎想要强制您替换类中相互
  • 线性渐变还需要浏览器前缀吗? [复制]

    这个问题在这里已经有答案了 我是否仍然需要使用线性渐变属性的浏览器前缀 background image webkit linear gradient top 2F2727 1a82f7 background image moz linea
  • 检查文件是否在 Delphi 中打开

    有没有办法检查文件是否已被 Delphi 中的 ReWrite 打开 代码会是这样的 AssignFile textfile somefile txt if not textFile IsOpen then Rewrite textFile
  • “类型对象指针”和“同步块索引”中存储了什么样的数据?

    在 CLR 中 每个实例都有 2 个附加字段来存储一些数据来管理对象 类型对象指针 同步块索引 您能否简单解释一下它们内部存储的内容以及 CLR 如何使用它们 Thanks 类型对象指针是指向对象类型描述的指针 这用于找出对象的实际类型是什
  • Pandas 在多列上应用元组解包函数

    Given a function它接受多个参数并返回多个值 如下所示 def tuple unpack value another value does some interesting stuff return value another
  • 动态更改 angular2-query-builder 中的配置

    在这里 我尝试根据 Angular2 query builder 中的字段值更改运算符 我的 TS 文件 Component selector my app template div h2 Hello name h2 div
  • Swift 中的全局修饰键按下检测

    我正在尝试使用Carbon的功能RegisterEventHotKey创建按下命令键时的热键 我这样使用它 InstallEventHandler GetApplicationEventTarget handler 1 eventType
  • perl awk OR sed,在两个时间戳之间搜索

    我有一个包含以下示例文本的文件 实际文字很大 2014 05 08 19 15 44 544824
  • WPF CheckBox 的选中和未选中状态的单独事件:为什么?

    有没有像这样的单一事件Changed我可以用它来一起处理这两个事件吗 为什么他们就这样分开呢 是否因为两个事件都有一个事件需要您按名称引用控件 您需要在 XAML 中指定该名称 这会增加混乱吗 不直接 但是 您可以对两者使用相同的事件处理程
  • 与 macOS Sierra 中的 AppTranslocation 相关的错误

    macOS Sierra 中的 Gatekeeper 似乎有点挑剔 无论如何 它导致我几年前制作的一个小实用程序抛出一个相当烦人的错误 由于我还没有时间深入研究 Sierra 的幕后变化 我不确定如何修复该错误 有人有处理与 AppTran
  • 如何将 Angular 2 服务与 Ionic 2 一起使用?

    我是 Ionic 2 的新手 我在 Angular 2 文档中读到 该服务需要在引导应用程序时注入 但在阅读 Ionic 2 教程时看不到任何引导程序 非常感谢任何帮助 Ionic2 中没有使用 Bootstrap 仅使用 App 来声明您
  • 反编译apk,lambda问题

    我反编译后的apk 分别出现了 java文件 但是有些文件的名字中有这样的 AudioPlayerActivity Lambda 1 java 这个 Lambda 1 是什么 AudioPlayerActivity Lambda 1 jav
  • 如何使用结构和实现的生命周期来推断实现的适当生命周期?

    我该如何解决这个错误 当我在中使用 匿名生命周期 时 我究竟在告诉编译器什么 impl struct LineHandlerInfo lt a gt label a str match literal a str f fn str gt O