Rust在函数体中支持强大的本地类型推断,但它故意不对项目签名的类型执行任何推理。然而,出于人体工程学的原因,在判断寿命时,确实应用了一种非常有限的二次推理算法,称为“终身省略”。终身省略仅涉及使用三个易于记忆和明确的规则来推断寿命参数。这意味着终身省略作为编写项目签名的简写,同时不会隐藏所涉及的实际类型,如果应用于完整的局部推理。
我不明白这意味着什么。什么是项目签名? “推断寿命参数”是什么意思?一些例子或类比会有所帮助。
答案 0 :(得分:16)
项目签名是一个位,它给出了你的功能的名称和类型,即你需要调用它的所有东西(不需要知道它是如何实现的);例如:
fn foo(x: u32) -> u32;
这是另一个需要&str
引用的内容:
fn bar<'a>(s: &'a str) -> &'a str;
在Rust中,所有引用都有附加的生命周期;这是该类型的一部分。上面的bar
函数说的不仅仅是&#34;这个函数接受一个字符串的引用并返回另一个&#34;。它说&#34;这个函数接受一个字符串引用,并返回另一个,它只有它给出的那个有效。这是Rust所有权系统的重要组成部分。
然而,每次指定这些生命周期都很烦人且很痛苦,所以Rust已经终生难忘了#34; (即&#34;没有明确地写出来&#34;)。所有这些意味着,对于一些非常常见的情况,您可以将生命周期注释保留,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
(即它是一个方法),那么所有省略的输出生命周期都与{{1 }}。这包括方法返回对其中一个字段的引用的常见情况。例如:self
变为:
impl S {
fn get_my_item(&self, key: &str) -> &str {}
}
文档中有更多示例。