生命周期省略规则
- 函数参数:
- 对于函数参数,Rust 有三条生命周期省略规则:
- 每个使用
&
的输入参数都有它自己的生命周期参数。例如,如果函数有两个参数&T
和&U
,它们分别有自己的生命周期参数,如fn foo<'a, 'b>(x: &'a T, y: &'b U) {... }
。
- 如果只有一个输入参数是
&
引用类型,那么这个引用的生命周期被赋予所有输出生命周期参数。例如fn bar<'a>(x: &'a T) -> &'a U {... }
。
- 如果有多个输入参数是
&
引用类型,但其中一个是&self
或&mut self
(在方法中),那么self
的生命周期被赋予所有输出生命周期参数。
- 函数返回值:
- 当函数返回值是
&
引用类型时,如果函数有符合上述规则的输入参数引用,返回值的生命周期会从输入参数的生命周期推导出来。如果没有合适的输入参数引用可用于推导(例如函数没有输入参数引用),那么需要显式指定返回值的生命周期。
代码示例
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}
解释
- 符合生命周期省略规则:
- 这个函数接收两个
&str
类型的参数x
和y
。根据生命周期省略规则的第一条,每个输入参数都有它自己的生命周期参数,虽然这里没有显式写出。
- 函数返回值是
&str
类型。由于函数有两个输入参数都是&str
类型,根据生命周期省略规则,返回值的生命周期会从输入参数的生命周期推导出来。这里返回值的生命周期与传入的x
或y
的生命周期相关联,具体取决于哪个字符串切片更长。因此,不需要显式地指定生命周期参数,Rust 编译器可以通过生命周期省略规则来推断正确的生命周期。这样写是可行的,因为编译器能够根据这些规则确定函数中所有引用的生命周期关系,从而确保内存安全。