【问题标题】:What are the Rust types denoted with a single apostrophe?用单个撇号表示的 Rust 类型是什么?
【发布时间】:2014-03-29 17:04:00
【问题描述】:

我在 Rust 中遇到过许多用单个撇号表示的类型:

'static
'r
'a

那个撇号有什么意义?也许它是引用的修饰符(&)?特定于参考的通用类型?我不知道这方面的文档藏在哪里。

【问题讨论】:

    标签: rust


    【解决方案1】:

    这些是 Rust 命名的生命周期。

    引用The Rust Programming Language

    Rust 中的每个引用都有一个生命周期,这是该引用有效的范围。大多数时间生命周期是隐含的和推断的,就像大多数时间类型是推断的一样。类似于我们必须注释类型,因为可能有多种类型,在某些情况下,引用的生命周期可能以几种不同的方式相关,因此 Rust 需要我们使用通用生命周期参数来注释关系,以便它可以确保在运行时使用的实际引用肯定是有效的。

    生命周期注释不会改变任何引用的时长 参与直播。就像函数可以接受任何类型一样 签名指定泛型类型参数,函数可以接受 当签名指定泛型时具有任何生命周期的引用 寿命参数。生命周期注释所做的是将 多个相互引用的生命周期。

    生命周期注解有一个稍微不寻常的语法: 生命周期参数必须以撇号 ' 开头。的名字 生命周期参数通常都是小写的,和泛型一样, 他们的名字通常很短。 'a 是大多数人使用的名称 默认。生命周期参数注释在 & 之后 引用,并且一个空格将生命周期注释与 引用的类型。

    换句话说,生命周期近似于引用指向的数据有效的执行跨度。 Rust 编译器会保守地推断出尽可能安全的最短生命周期。如果你想告诉编译器一个引用的生命周期比最短的估计长,你可以命名它,例如,输出引用与给定的输入引用具有相同的生命周期。

    'static 生命周期是一个特殊的生命周期,是所有生命周期中最长的生命周期 - 在程序期间。一个典型的例子是字符串“文字”,它在程序/模块的生命周期内始终可用。

    您可以从this slide deck 获取更多信息,从幻灯片 29 开始。

    Lifetimes in Rust 还深入讨论了生命周期。

    【讨论】:

      【解决方案2】:

      为了补充 quux00 的出色答案,命名生命周期还用于向 rust 编译器指示返回的借用变量的来源。

      这个函数

      pub fn f(a: &str, b: &str) -> &str {
        b
      }
      

      不会编译,因为它返回一个借来的值,但没有指定它是从a 还是b 借来的。

      要解决这个问题,您需要声明一个命名生命周期,并为 b 和返回类型使用相同的生命周期:

      pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
      //      ----              ---         ---
        b
      }
      

      并按预期使用它

      f("a", "b")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-01
        • 2014-09-10
        • 1970-01-01
        • 2010-11-30
        • 2016-02-20
        • 2010-12-05
        • 2023-04-07
        • 2018-09-20
        相关资源
        最近更新 更多