项目签名是给出函数名称和类型的位,即您需要调用它的所有内容(无需知道它是如何实现的);例如:
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
文档有更多示例。