我想做类似的事情
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] 删除。
我来说两句