I want to update an enum variant while moving a field of the old variant to the new one without any cloning:
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),
}
}
This doesn't work because we can't move s
from &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
Please don't suggest things like implementing an enum X { X1, X2 }
and using struct S { variant: X, str: String }
etc. This is a simplified example, imagine having lots of other fields in variants, and wanting to move one field from one variant to another.
Question&Answers:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…