rust - 用非常简单的术语来说,什么是生命周期省略?

标签 rust lifetime

来自 the Rust documentation :

Rust supports powerful local type inference in the bodies of functions, but it deliberately does not perform any reasoning about types for item signatures. However, for ergonomic reasons, a very restricted secondary inference algorithm called “lifetime elision” does apply when judging lifetimes. Lifetime elision is concerned solely with inferring lifetime parameters using three easily memorizable and unambiguous rules. This means lifetime elision acts as a shorthand for writing an item signature, while not hiding away the actual types involved as full local inference would if applied to it.

我不明白这是什么意思。什么是项目签名? “推断生命周期参数”是什么意思?一些示例或类比会有所帮助。

最佳答案

项目签名是给出函数名称和类型的位,即调用它所需的一切(无需知道它是如何实现的);例如:

fn foo(x: u32) -> u32;

这是另一个采用 &str 引用的方法:

fn bar<'a>(s: &'a str) -> &'a str;

在 Rust 中,所有引用都有一个附加的生命周期;这是类型的一部分。上面的 bar 函数不仅仅是“这个函数获取一个字符串的引用并返回另一个字符串”。它说“这个函数接受一个字符串引用,并返回另一个只要给定它就有效。这是 Rust 所有权系统的重要组成部分。

然而,每次都指定这些生命周期是很烦人和痛苦的,所以 Rust 有“生命周期省略”(即“不显式地写出它们”)。这意味着对于一些非常常见的情况,您可以省略生命周期注释,Rust 会隐式地为您添加它们。这纯粹是为了方便程序员,让他们不必在“明显”的情况下写那么多生命周期。

规则列于the book ,但为了完整起见,它们是:

  1. 函数参数中未另行指定的每个生命周期都是不同的。例如:
fn f(x: &T, y: &U)

意思是:

fn f<'a, 'b>(x: &'a T, y: &'b U)

即这些生命周期之间没有自动链接。

  1. 如果只有一个输入生命周期,则它用于每个输出生命周期。例如:
struct U<'a> {}  // struct with a lifetime parameter

fn f(x: &T) -> &U

变成:

fn f<'a>(x: &'a T) -> &'a U<'a>
  1. 否则,如果有多个输入生命周期,但其中一个是 &self&mut self(即它是一种方法),则所有省略的输出生命周期都相同作为 self 。这涵盖了方法返回对其字段之一的引用的常见情况。例如:
impl S {
    fn get_my_item(&self, key: &str) -> &str {}
}

变成:

fn get_my_item<'a,'b>(&'a self, key: &'b str) -> &'a str  // use the self lifetime

文档中有更多示例。

关于rust - 用非常简单的术语来说,什么是生命周期省略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325690/

相关文章:

rust - 有没有办法在不可变地借用早期元素的同时向容器添加元素?

c - 64 位整数按位运算的成本与 8 位整数相同吗?

rust - 为什么将函数移至默认特征方法会导致借入错误?

rust - 扩展 Rust 生命周期

rust - 如何在闭包中正确定义生命周期

generics - 如何将泛型指定为 "don' t care”?

rust - 我可以使用 Rust 词法分析器或解析器来检索 Rust 文件中的函数列表吗?

rust - 是问号运算符?相当于试试!宏观?

struct - 比结构方法长寿

c++11 - C++11中有没有更好的方法在堆栈上构造类