来自Rust文档:
Rust支持在函数体中进行强大的本地类型推断,但它有意不对项目签名进行任何类型推理。然而,出于人性化的考虑,在判断生命周期时会应用一种非常受限的次要推断算法,称为“生命周期省略”。生命周期省略仅关注使用三个易于记忆和明确无误的规则推断生命周期参数。这意味着生命周期省略充当了编写项目签名的简写,同时不会像完全应用于它时的本地推断那样隐藏实际涉及的类型。
我不理解这是什么意思。什么是项目签名?什么是“推断生命周期参数”?一些例子或类比将会很有帮助。
fn foo(x: u32) -> u32;
&str
引用的例子:fn bar<'a>(s: &'a str) -> &'a str;
bar
函数不仅表示"这个函数接受一个字符串的引用并返回另一个引用",它还表示"这个函数接受一个字符串引用,并返回另一个引用,该引用有效的时间与给定的引用一样长。这是Rust所有权系统的重要部分。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