当前位置:  开发笔记 > 后端 > 正文

不能移出定义`Drop`特征的类型[E0509]

如何解决《不能移出定义`Drop`特征的类型[E0509]》经验,为你挑选了1个好方法。

我有以下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

发生了什么,我该如何解决?



1> Shepmaster..:

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以便它在下降时进行调整.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有