【发布时间】:2021-12-31 13:50:52
【问题描述】:
我想更新枚举变体,同时将旧变体的字段移动到新变体而不进行任何克隆:
enum X {
X1(String),
X2(String),
}
fn increment_x(x: &mut X) {
*x = match *x {
X::X1(s) => X::X2(s),
X::X2(s) => X::X1(s),
}
}
这不起作用,因为我们无法将 s 从 &mut X 移动:
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:7:16
|
7 | *x = match *x {
| ^^
| |
| cannot move out of borrowed content
| help: consider removing the `*`: `x`
8 | X::X1(s) => X::X2(s),
| - data moved here
9 | X::X2(s) => X::X1(s),
| - ...and here
请不要提出诸如实现enum X { X1, X2 } 和使用struct S { variant: X, str: String } 等的建议。这是一个简化的示例,想象一下变体中有很多其他字段,并且想要将一个字段从一个变体移动到另一个。
【问题讨论】:
-
在
String的情况下,您可以在mem::replace字段中输入一个空字符串,并使用结果形成新的变体。只是几个动作。但这仅适用于具有廉价形式(如空字符串)的类型。 -
仅供参考,我有proposed
std::mem::replace_with,在这种情况下应该会有所帮助。
标签: rust