rust 生命周期标注

参考博客:https://blog.csdn.net/qq_46878411/article/details/123045316

Note:Rust生命周期标注,仅仅是告诉编译器变量的生命周期是什么样的,并不会真正改变变量的生命周期

生命周期标注方法:一个单引号+一个或者几个小写字母表示,生命周期符号放在&之后变量类型之前

&i32//一个引用
&a' i32 //生命周期标准
&a' mut i32 //生命周期标注
多重生命周期标注
//标准生命周期'a 和 ‘b
fn tt<'a,'b>(s1:&'a String,s2:&'b String)->&'a String{
    s1//ok
    s2//error 因为s2的生命周期b'返回值的生命周期a'不一致
}
单一生命周期标注,如果作为输入参数,返回值的实际生命周期由生命周期较短者决定
fn longest<'a>(s1:&'a String,s2:&'a String)->&'a String{
    s1
}
 let r;
    {
        let s1 = String::from("hellow");
        let s2 = String::from("word");
        r = longest(&s1,&s2);

        println!("lift {}",r);//ok
        
    }
    println!("lift {}",r);//error, value does not live long enough
生命周期的3条规则
  1. 每一个是引用的参数都有它自己的生命周期参数
fn f(x:&i32){};//生命周期属于引用对象本身
fn<'a> f(x:&'a i32){}////生命周期属于引用对象本身
  1. 如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数
fn f2(x:&String)->&String{}//返回这生命周期同参数x
fn f2<'a>(x:&'a String)->&'a String{}//显示标注,返回这生命周期同参数x

//为什么输出值一定是a‘即使没有显示标注?
//因为输出值是引用,如果引用不属于输入参数,那么只能是内部参数的引用,此时就会产生悬垂引用。
//这是不被允许的
  1. 如果方法有多个输入生命周期参数并且其中一个参数是 &self 或 &mut self, 那么在非标注生命周期时,所有输出生命周期参数被赋予 self 的生命周期。标注生命周期之后则取生命周期较短者,即非self。
impl ABC {
	//此时没有显示标注生命周期,所以默认返回值为self的生命周期,
	fn f1(&self,a:&String)->&String{
		a //错误,因为生命周期不同
		&self.xxx//ok
	}
	
	//标注生命周期之后,根据单一生命周期标注规则,输出值生命周期取生命周期较短者
	//所以此时返回a是OK的
	//这里返回值标注可以取消,默认即&'a 
	fn f2<'a>(&self,a:&'a String)->&'a String{//但是可以这样
		a//ok
		&self.xxx//错误,因为生命周期不同
	}
}

静态生命周期

'static 其生命周期能够存活于整个程序期间,但是注意是否真正的能够存活于程序的整个运行期间,取决于变量的本身定义,和是否标注'static无关,'static仅仅只是告诉编译器而已,并不能该变变量原始生命周期

所有的字符串字面值(&str)都拥有 'static 生命周期。

你可能感兴趣的:(rust,rust,开发语言,生命周期,生命周期标注,标注)