什么是非常简单的终身省略?
Posted
技术标签:
【中文标题】什么是非常简单的终身省略?【英文标题】:What is lifetime elision in very simple terms? 【发布时间】:2017-03-12 13:30:27 【问题描述】:来自the Rust documentation:
Rust 在函数体中支持强大的本地类型推断,但它故意不对项目签名的类型执行任何推理。然而,出于人体工程学的原因,在判断寿命时确实适用了一种非常有限的二次推理算法,称为“寿命省略”。生命周期省略仅涉及使用三个易于记忆且明确的规则来推断生命周期参数。这意味着生命周期省略充当编写项目签名的简写,而不是隐藏所涉及的实际类型,因为如果应用于它,则完全本地推断会这样做。
我不明白这是什么意思。什么是项目签名? “推断生命周期参数”是什么意思?一些例子或类比会有所帮助。
【问题讨论】:
【参考方案1】:项目签名是给出函数名称和类型的位,即您需要调用它的所有内容(无需知道它是如何实现的);例如:
fn foo(x: u32) -> u32;
这是另一个采用&str
引用的方法:
fn bar<'a>(s: &'a str) -> &'a str;
在 Rust 中,所有引用都有一个附加的生命周期;这是类型的一部分。上面的bar
函数说的不仅仅是“这个函数引用一个字符串并返回另一个字符串”。它说“这个函数接受一个字符串引用,并返回另一个只要它被给定就有效。这是Rust所有权系统的重要组成部分。
然而,每次都指定这些生命周期很烦人,也很痛苦,所以 Rust 有“生命周期省略”(即“没有明确地写出它们”)。这意味着对于一些非常常见的情况,您可以省略生命周期注释,Rust 会为您隐式添加它们。这纯粹是为程序员提供便利,这样他们就不必在“显而易见”的情况下编写这么多生命周期。
规则在the book 中列出,但为了完整起见,它们是:
-
函数参数中未另行指定的每个生命周期都是不同的。例如:
fn f(x: &T, y: &U)
意思是:
fn f<'a, 'b>(x: &'a T, y: &'b U)
即这些生命周期之间没有自动联系。
-
如果只有一个输入生命周期,它将用于每个输出生命周期。例如:
struct U<'a> // struct with a lifetime parameter
fn f(x: &T) -> &U
变成:
fn f<'a>(x: &'a T) -> &'a U<'a>
-
否则,如果有多个输入生命周期但其中一个是
&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
文档有更多示例。
【讨论】:
以上是关于什么是非常简单的终身省略?的主要内容,如果未能解决你的问题,请参考以下文章