生命周期的省略

生命周期的省略有如下三个规则:

  1. 每个引用参数(注意是引用的参数 )都有他自己的生命周期参数:
    一个引用参数的函数,其中有一个生命周期:
    1
    fn foo<'a>(x: &'a i32)
    两个引用参数的函数,有两个生命周期:
    1
    fn foo<'a,'b>(x: &'a i32,y:&'b i32)
  2. 如果只有一个输入生命周期参数,所有的输出生命周期参数会得到同样的生命周期
    1
    2
    3
    fn foo(x:&i32) ->&i32  
    //等价于
    fn foo<'a>(x: &'a i32) -> &'a i32
  3. 在方法方法不同于普通的函数,它有self参数 中,如果有多个输入
    生命周期,但是其中一个是&self或者&mut self,那么self的生命周期被赋予所有输出生
    命周期参数。
    1
    2
    3
    4
    //伪代码
    fn function(&self,x:&str,y:&str,....) -> &str
    //等价
    fn function<'a,'b,'c>(&'a self,x:&'b str,y:&'c str) -> &'a str
  • 简单例子
1
2
3
4
5
6
7
8
9
10
11
//这种情况下就不需要标注
fn get_a_str(s: &str) -> &str {
s
}
fn main() {
let n = String::from("hello");
let s = get_a_str(&n);
println!("s = {}",s);

}