未标注生命周期时Rust函数的生命周期及impl中'a的含义
Rust生命周期问题解答
1. 未完全标注时,inc_and_return函数的实际生命周期是什么?
根据Rust的生命周期省略规则,当函数参数为&mut self时,编译器会自动为这个引用生成一个匿名临时生命周期(通常记为'_)。这个生命周期仅覆盖函数调用的整个过程,函数执行完毕后,对self的可变借用会立即释放。
未标注的代码等价于:
fn inc_and_return<'b>(&'_ mut self, s: &'b str) -> &'b str { self.x += 1; s }
正因为这个临时生命周期的范围有限,main中调用inc_and_return后,f的可变借用立刻结束,后续可以正常对f.s进行不可变借用,所以代码能正常运行。
2. 在impl<'a> Foo<'a>的函数中引用'a意味着什么?
impl<'a> Foo<'a>中的'a是结构体Foo的生命周期参数,它绑定了结构体内部引用s的有效范围(也就是示例中hello的生命周期)。当你把self的生命周期标注为'a时,相当于强制要求对self的可变借用必须持续整个结构体的生命周期'a。
换句话说,一旦调用这个标注了'a的inc_and_return,f的可变借用会一直持续到hello被销毁(即main函数结束)。而Rust的借用规则明确禁止同一时间存在可变借用和不可变借用,所以后续访问f.s时就会触发编译错误。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

