struct TestLifetime <'a> 这句话是什么意思?答案是:如果你用struct TestLifetime声明了 test变量,那编译器会将test的生命周期标记成’a,你可以用用这个标记规定结构体内的变量的生命周期。
struct TestLifetime <'a> {
item: 'a &i32;
}
意思是如果定义了
let i=5;
let test= TestLifetime{&i};
则 i 的必须活的不比test短,也即i的作用域要大于test,举个例子;
let test : TestLifetime;
{
let i=5;
test.item =&i;
}
i的作用域结束后,test还存在,造成悬垂指针。但这个例子由于有了生命周期参数,编译器会发现并出错。
生命周期在结构定义,函数或方法定义中使用时,主要就是定义出借用之间的生命周期比较关系,让编译器有评判依据。一般来讲,结构之中如果有引用,那就要定义结构体变量和引用之间的生命周期关系。函数如果输入参数有引用,又返回引用,那就要定义输入引用和返回引用的生命周期关系。生命周期关系一般使用同一个标识,编译器会自动做判断,结构就是结构体定义出的变量生命周期应不大于结构成员的生命周期。函数的返回变量赋值的变量的生命周期应不小于函数参数变量的生命周期。
RUST程序员唯一关注的就是在使用引用的时候,要敏感的注意到此引用与其他引用有没有生命周期的比较关系,如果有就用生命周期参数来做一个标识,并利用标识表示出引用之间的生命周期关系。然后就可以把这个引用变量的生命周期抛在脑后,编译器会接管剩下来的事情。