我有以下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"),
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器commit()通过以下消息抱怨该行
cannot move out of type `SqlTransaction<'a>`, which defines the `Drop` trait [E0509]at line 12 col 22
Run Code Online (Sandbox Code Playgroud)
发生了什么,我该如何解决?
该Transaction::commit方法消耗的交易:
pub fn commit(self) -> Result<()> {
self.set_commit();
self.finish()
}
Run Code Online (Sandbox Code Playgroud)
如果你是能够调用commit,那么价值self将是一些不一致的状态,因为会有什么价值self.transaction呢?它被搬走了!
如果类型没有实现Drop,这不会是一个问题,因为编译器只会删除结构的所有其他部分.但是,既然它实现了Drop,那么你永远不能分开结构,因为那样Drop就无法运行了!当您进入Drop实现本身时,这甚至适用.
如果你真的需要这样做,你必须有transaction一些你可以轻易替换的类型.一个Option是一个很好的选择,因为你可以用take它替换它None.
在具体情况下Transaction,您不必做任何特别的事情.虽然Transaction通常会回滚,但您可以调用Transaction::set_commit以便它在下降时进行调整.
| 归档时间: |
|
| 查看次数: |
1430 次 |
| 最近记录: |