我有以下Rust代码使用rust-postgres,意图在我的struct超出范围后提交事务
struct SqlTransaction<'a> { connection: &'a Connection, transaction: Transaction<'a>, } impl<'a> Drop for SqlTransaction<'a> { fn drop(&mut self) { let result = self.transaction.commit(); match result { Ok(_) => print!("herp"), Error => print!("lol"), } } }
编译器commit()
通过以下消息抱怨该行
cannot move out of type `SqlTransaction<'a>`, which defines the `Drop` trait [E0509]at line 12 col 22
发生了什么,我该如何解决?
该Transaction::commit
方法消耗的交易:
pub fn commit(self) -> Result<()> { self.set_commit(); self.finish() }
如果你是能够调用commit
,那么价值self
将是一些不一致的状态,因为会有什么价值self.transaction
呢?它被搬走了!
如果类型没有实现Drop
,这不会是一个问题,因为编译器只会删除结构的所有其他部分.但是,既然它实现了Drop
,那么你永远不能分开结构,因为那样Drop
就无法运行了!当您进入Drop
实现本身时,这甚至适用.
如果你真的需要这样做,你必须有transaction
一些你可以轻易替换的类型.一个Option
是一个很好的选择,因为你可以用take
它替换它None
.
在具体情况下Transaction
,您不必做任何特别的事情.虽然Transaction
通常会回滚,但您可以调用Transaction::set_commit
以便它在下降时进行调整.