fn longer_string(s1: &str, s2: &str) -> &str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
生命周期推断原理
- 参数生命周期:在函数
longer_string
中,参数s1
和s2
都是字符串切片&str
类型。这意味着它们都有一个隐含的生命周期,但是在函数定义时并没有显式标注生命周期参数。
- 返回值生命周期:函数返回类型
&str
同样没有显式标注生命周期参数。
- Rust的生命周期推断规则:
- 第一条规则:每个引用参数都有它自己的生命周期参数。对于
longer_string
函数,s1
和s2
分别有自己的生命周期,假设为'a
和'b
。
- 第二条规则:如果只有一个输入生命周期参数,那么它被赋给所有输出生命周期参数。在这个函数中,虽然有两个输入参数
s1
和s2
,但由于返回值要么是s1
要么是s2
,所以Rust编译器能够推断出返回值的生命周期与输入参数的生命周期相关。
- 第三条规则:如果有多个输入生命周期参数,且其中一个是
&self
或&mut self
(适用于方法),那么self
的生命周期被赋给所有输出生命周期参数。此规则在本函数中不适用,因为它不是方法。
- 综合以上规则,Rust编译器可以推断出返回值的生命周期与输入参数的生命周期中的某一个相同(因为返回值就是其中一个输入参数),所以代码能够正确编译且不存在内存安全问题。