我有一个类似有限状态机的枚举,它有不同的状态,包含不同类型的缓冲区。
在我的“transition”方法中,我更新了一个枚举字段,并有条件地将self
替换为不同的变量,重用旧的字段值。
但是在一个特定的情况下,我想将一个大的缓冲区从旧的变体移动到新的变体,借用检查不会让我。
什么是正确的方法来做到这一点,同时避免昂贵的复制整个缓冲区?
impl EnumBased {
fn step(&mut self) {
match self {
EnumBased::A(..) => { /* do something */ },
EnumBased::B {
buffer, // &mut Buffer
} => {
buffer.do_something()
if something {
// consume buffer, moving out of self
let inner = buffer.to_inner(); // <-- at this point, can't move out of a mutable reference
// overwrite now-defunct self
*self = EnumBased::C { inner, ... }
}
},
}
}
}
字符串
1条答案
按热度按时间0s0u357o1#
首先,我将您的代码更改为几乎可以编译的代码。
字符串
如果一个缓冲区可以很便宜地构建(比如
Vec
),你可以简单地用一个空的缓冲区来替换它,一种方法是用std::mem::take
。型
如果这不可能,你可以让你的enum廉价地构造。要么使用现有的廉价变体,要么为此专门创建一个新的变体。然后你可以使用
std::mem::replace
来简单地替换self
。型
使用专用变量的好处是,如果你在这个函数之外看到它,你就知道出了问题。