如何更新对不可复制类型的可变引用?

dspyz

我想做类似的事情

impl Widget {
    fn foo(self, rhs: Widget) -> Self {
        // Some stuff
    }

    fn update(&mut self, rhs: Widget) {
        *self = (*self).foo(rhs)
    }
}

但是编译器抱怨“无法移出借用的上下文”。什么是正确的方法?

清算

一种选择是使用take_mut板条箱,该板条箱提供的take功能完全可以满足您的需求:

take允许T取出a &mut T,对其进行任何处理(包括使用它),然后生成另一个内容T以放回&mut T

正如FrancisGagné指出的,这样做的问题是,&mut如果发生恐慌,引用将处于无效状态,这可能导致不确定的行为。take_mut方法是:

在此期间take,如果发生恐慌,则将退出整个过程,因为没有有效的T放回的操作&mut T

这是使用的代码take

extern crate take_mut;

struct Widget;

impl Widget {
    fn foo(self, rhs: Widget) -> Self {
        self
    }

    fn update(&mut self, rhs: Widget) {
        take_mut::take(self, |s| s.foo(rhs));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章