【问题标题】:Clarification on Rust lifetime syntax关于 Rust 生命周期语法的说明
【发布时间】:2021-07-01 06:53:51
【问题描述】:

我在处理 Rust 生命周期时看到的典型示例是以下 func:

pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
   if x.len() > y.len() {
      x
   } else {
      y
   }
}

有趣的是,这似乎转化为“longest() 结果的生命周期是其输入参数的最短生命周期”。逻辑对我来说很有意义,但我不明白 如何 这是通过语法传达的。

当我查看该函数时,它看起来有一个生命周期 'a 并且该函数似乎强制 xy 必须具有 精确 相同的生命周期 'a因此结果必须具有相同的生命周期'a

我不确定这种语法是否本质上是我所看到的语法糖。如果我被允许冗长,那么我认为语法看起来像(我知道这不是正确的语法):

pub fn longest<'a, 'b>(x: &'a str, y: &'b str) -> min('a, 'b) str {
   if x.len() > y.len() {
      x
   } else {
      y
   }
}

我理解正确还是误解了语言?

【问题讨论】:

  • 这能回答你的问题吗? Semantics of lifetime parameters
  • 我认为一个更好的例子是fn find&lt;'a, 'b&gt;(pattern: &amp;'a str, text: &amp;'b str) -&gt; &amp;'b str - 这里的生命周期清楚地表明该函数正在返回text的一部分,而不是pattern的一部分。编译器无法猜到这一点,除非通过查看函数体,编译器拒绝这样做以保持函数签名作为合同有意义。

标签: rust lifetime


【解决方案1】:

'a 的生命周期参数意味着引用需要在至少生命周期 'a 中存在。可以传入一个持续时间超过'a 的引用。

当函数longest()被调用时,编译器需要从传入的具体参数中推断出'a的生命周期。编译器足够聪明地推断出这个生命周期是@987654326实际生命周期的交集@ 和 y,确保每个参数都满足生命周期界限。

本质上,这意味着你的解释是正确的。

【讨论】:

    【解决方案2】:

    当我读到它时,如下:

    pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
       if x.len() > y.len() {
          x
       } else {
          y
       }
    }
    

    声明fn longest&lt;'a&gt;(x: &amp;'a str, y: &amp;'a str) -&gt; &amp;'a str

    1. 将单个生命周期标签'a 引入函数范围
    2. 用生命周期标签'a 标记引用参数xy 所针对的两个未命名字符串切片的最短剩余生命周期。现在'a 有一个约束。
    3. 返回对未命名字符串切片的引用,该切片保证与'a 一样长。编译器现在将确保调用者不会假定结果的生命周期会比它提供的参数的最短生命周期长。

    注意:

    • 生命周期标签与引用的目标相关联,而不是与引用本身相关联。也就是说,引用被读作&amp; (description of the thing referenced such as its lifetime, type, etc.)
    • 引用是用于访问其目标的基本内容,并且仅在其目标处于活动状态时才有效。因此,本质上假定引用的生命周期永远不会超过目标的生命周期,因此不需要指定(除非它成为引用本身的目标)。
    • 生命周期由程序流程决定。标记只是表面已经存在的东西以允许表达关系(要求和保证)。在其他语言中,此类约束将是不可见的,并且不会被编译器检查。诚然,编译器可以拒绝有效程序,但它永远不会接受无效程序。

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2022-07-16
      • 2013-07-03
      • 2016-02-18
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多