Rust中调用`pub fn func(&'a mut self)`后self仍被可变借用的原因?
问题核心原因
你在func方法的&mut self参数上手动绑定了和Struct1实例一致的生命周期'a,直接导致可变借用的生命周期被拉长到和实例本身的存活周期完全一致,而非仅在函数调用期间有效。
impl<'a> Struct1<'a>中声明的生命周期'a,指代的是Struct1实例的完整生命周期:对应你示例代码中就是从main函数里s1被创建开始,直到main函数结束s1被销毁为止的整段时间。- 你写的
pub fn func(&'a mut self)相当于主动告知Rust编译器:当前方法对self的可变借用,存活时长必须和Struct1实例的生命周期'a完全匹配。 - 因此第一次调用
s1.func()产生的可变借用,会一直持有到s1销毁才会释放,自然到point3位置尝试第二次可变借用s1时,就会触发「同一时间只能有一个可变借用」的规则报错。
修复方案
直接去掉func方法中self的'a生命周期标注即可:
impl<'a> Struct1<'a> { // 其余方法保持不变 pub fn func(&mut self) { () } }
没有手动标注生命周期时,Rust会自动将该方法的可变借用生命周期限定在函数调用范围内,调用结束后借用就自动释放,第二次调用不会再触发冲突。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

