【问题标题】:Why does Rust translate same lifetime specifiers as the smaller one为什么 Rust 翻译的生命周期说明符与较小的说明符相同
【发布时间】:2022-07-16 02:02:04
【问题描述】:

在 Rust 文档中,我们看到了这个例子:

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

解释如下:

函数签名现在告诉 Rust 在某个生命周期 'a 中, 函数有两个参数,这两个参数都是字符串切片 至少活得和一生一样长'a。函数签名也 告诉 Rust 从函数返回的字符串切片将存在 至少只要有生之年'a。在实践中,这意味着 最长函数返回的引用的生命周期相同 作为传入的引用的生命周期中较小的一个

注意in practice 后面的词。它提到:

在实践中,这意味着 最长函数返回的引用的生命周期相同 作为传入引用的生命周期中较小的一个

我不明白为什么在实践中,这意味着返回的生命周期与这两个参数的生命周期中较小的一个相同。这是我需要记住的东西还是什么?我们可以清楚地说参数和返回值都有'a相同的说明符。为什么 Rust 认为这意味着返回的值应该具有 smaller 这两个传递的生命周期?

【问题讨论】:

标签: rust


【解决方案1】:

为什么 rust 认为这意味着返回值应该具有 SMALLER 生命周期的那 2 个?

因为这是唯一有意义的事情。想象一下这种情况:

let a = "foo";              // &'static str
let s = "bar".to_string();  // String
let b = s.as_str();         // &str (non-static, borrows from s)

let longest = longest(a, b);

a 的生命周期是'static,即a 与程序一样长。 b 的生命周期比这短,因为它与变量 s 的生命周期相关。但是longest只接受一世!

Rust 所做的是计算一个生命周期,它是 'static 生命周期 a 和绑定到s 生命周期 b交集,并使用 that 作为longest() 的(此调用)的生命周期。如果找不到这样的生命周期,则会出现借用检查错误。如果能找到,则不会超过最短的源生命周期。

在上述情况下,'static 和绑定到 s 的生命周期的交集是绑定到 s 的生命周期,所以这就是 'alongest() 中使用的生命周期。

【讨论】:

  • 所以编译器,当谈到 longest 函数被调用的位置时,编译器仍然会分析这部分并知道传递了什么参数以及它们的作用域。然后转到longest 函数,只读取签名并查看最长函数可能返回的参数。它唯一不做的就是分析longest的正文
  • 我想知道,在我的示例中,为什么 rust 不能想出一种将其集成到省略规则中的方法?就一个例子而言,这将是什么相反的论点?
  • @NikaKurashvili 分析 caller 以实现终身省略是行不通的,因为它需要知道所有的调用者(可以在不同的 crate 中,等等)。出于省略目的分析 body 是行不通的,因为通过更改实现的细节来修改签名太容易了。 Elision 旨在允许“明显”的语法糖缩短整个生命周期规范,对于生命周期很明显的情况。 (例如,如果函数接受一个引用并返回一个,那么假设它们具有相同的生命周期是有意义的。)
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2015-08-24
  • 2016-02-18
  • 2017-01-14
  • 2011-07-29
相关资源
最近更新 更多