如何理解Rust中impl上的生命周期注解?析'a与'c的关联差异
Rust生命周期参数'a与'c的区别、关联及impl注解解析
一、impl上的生命周期注解<'a>的含义
impl块开头的<'a>是为了将结构体ImportantExcerpt<'a>的生命周期参数引入当前impl的作用域。简单说就是:这个impl块里的所有方法,都是针对带有生命周期'a的ImportantExcerpt实例编写的,确保编译器能把结构体的生命周期和方法里的引用关联起来。
二、'a与'c的区别
'a:结构体的固有生命周期
它绑定在ImportantExcerpt结构体上,用来约束结构体中part字段的引用存活时间。规则很明确:ImportantExcerpt实例的存活时间绝对不能超过part引用的存活时间,否则会产生悬垂引用,编译器直接报错。'c:方法调用时的借用生命周期
它是方法announce_and_return_part的生命周期参数,代表调用该方法时,&self(也就是对ImportantExcerpt实例的借用)的存活时长。每次调用这个方法,编译器都会根据实际的代码上下文,自动推断出'c的具体范围。
三、'a与'c的关联
因为&'c self是对ImportantExcerpt<'a>实例的借用,所以'c的存活时间必须小于等于'a。道理很简单:结构体实例本身的存活时间就被'a限制了(不能超过part的存活时间),那对这个实例的借用,自然也不能比实例本身活的更久。
另外,方法返回的&'c str其实就是self.part(生命周期为'a),但因为'c ≤ 'a,所以把返回值的生命周期标注为'c是安全的——相当于把更长的生命周期'a缩小到'c的范围,编译器允许这种“缩小生命周期”的操作,不会有安全问题。
内容的提问来源于stack exchange,提问作者BaiTang
相关产品推荐
相关产品推荐

