Я хочу обновить перечислимый вариант при перемещении поля старого варианта на новое без клонирования:
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 }
и т.д. Это упрощенный пример, представьте себе, что в вариантах есть много других полей и вы хотите переместить одно поле из одного варианта в другой.