Rust rusqlite调用tx.prepare后执行commit报借用中无法转移所有权错误
Rust借用规则冲突问题解答
核心原因是Statement的生命周期绑定了Transaction的借用,和commit需要转移所有权的要求冲突:prepare方法签名里的返回值Result<Statement<'_>>中的生命周期'_代表返回的Statement实例持有&Transaction的不可变借用,只要stmt变量没有被销毁,这个借用就一直处于活跃状态。
你的三个疑问解答:
- 调用
tx.prepare完成借用后,Transaction实例的所有权没有发生任何转移,只是被返回的stmt临时借出了不可变引用。所有权本身没有变化,只是在借用释放前,tx的操作会受借用规则限制。 tx仍然是该Transaction实例的唯一所有者,借用行为只会临时限制所有者的操作权限,不会改变所有权的归属。commit方法的参数是mut self,属于按值传递,调用时需要将tx持有的Transaction实例的所有权完全转移到方法内部。但此时stmt还处于存活状态,仍然持有tx的不可变借用,Rust的借用检查规则不允许在存在活跃借用的情况下转移原值的所有权,因此触发报错。
独立作用域修复的原理
将stmt相关代码包裹在独立的花括号作用域中后,stmt变量会在作用域结束时自动析构,它持有的对tx的不可变借用也会同步释放。等到执行tx.commit()时,已经没有任何活跃的借用约束,自然可以正常转移所有权完成提交操作。
内容的提问来源于stack exchange,提问作者ccheneson
相关产品推荐
相关产品推荐

