Rust 为&mut self标注生命周期'a为何触发多次可变借用错误?
问题原因解析
你遇到的报错并不是借用检查器对显式生命周期标注有特殊处理,而是你手动添加的'a生命周期标注错误地将方法的可变借用生命周期和结构体自身的生命周期参数绑定,不必要地拉长了可变借用的存活时间。
具体原理
- 结构体
Point<'a>的生命周期参数'a,代表其内部x字段持有的字符串引用的有效生命周期。在示例中x赋值为字符串字面量"empty",对应的生命周期是'static,至少也和p实例的整个存活周期完全匹配。 - 当你把方法签名写为
fn up(&'a mut self)时,相当于主动向编译器声明:调用该方法产生的对Point实例的可变借用,生命周期必须和结构体的'a完全相等。这就导致第一次调用p.up()产生的可变借用,会一直存活到p实例被销毁才会失效。 - 遵循Rust的借用规则,同一时间最多只能有一个活跃的可变借用,因此第二次调用
p.up()尝试再次可变借用p时,前一个可变借用还未释放,自然就触发了cannot borrowpas mutable more than once at a time的报错。
移除标注后正常编译的原因
当你去掉'a标注,方法签名变为fn up(&mut self)时,编译器会自动为这个方法的&mut self分配一个独立的、仅覆盖方法调用过程的短生命周期:可变借用在up方法执行结束后就立刻失效,不会延长到p的整个生命周期。第一次调用结束后可变借用已经释放,第二次调用自然不会产生冲突。
补充说明
显式生命周期标注本质是开发者给编译器传递的约束规则,编译器不会对它做额外的特殊处理,只会严格按照标注的约束执行检查。只有标注和实际的使用逻辑匹配时,代码才能正常通过编译。
内容的提问来源于stack exchange,提问作者Matt Woelk
相关产品推荐
相关产品推荐

