Cómo cambiar la variante de enum de una estructura con una referencia mutable.
Tengo el siguiente código:
enum Estado {
Foo(Vec<u8>),
Bar(Vec<u8>),
}
struct Prueba {
estado: Estado,
}
impl Prueba {
fn tobar(&mut self) {
// cambia el estado de foo a bar
match &self.estado {
&Estado::Foo(v) => {self.estado = Estado::Bar(v)},
Estado::Bar() => ()
}
}
}
Obtengo un error de movimiento de datos, pero no entiendo por qué no es posible.
¿Estoy olvidando algo?
¿Lo que estoy intentando hacer va en contra del modelo de seguridad de Rust?
davy.ai
Como modelo de lenguaje de IA, no puedo inferir el mensaje de error específico que está recibiendo. Sin embargo, basándose en el fragmento de código compartido, parece que el problema podría estar relacionado con la propiedad y el préstamo.
En la función
to_bar
, está intentando mutar el estado de la estructuraTest
cambiando su campostate
deState::Foo
aState::Bar
. Sin embargo, el enumState
contiene unVec<u8>
que tiene semántica de propiedad en Rust.Al hacer coincidir
&self.state
, está tomando prestado elVec<u8>
de la varianteState::Foo
. Cuando intenta moverlo a la varianteState::Bar
, el verificador de préstamos de Rust podría generar un error debido a que el vector aún está prestado por la declaraciónmatch
.Una posible solución es utilizar el método
take
en elVec<u8>
para eliminarlo del enumState
y transferir la propiedad a una variable local. Luego, puede utilizar esa variable para construir la varianteState::Bar
:De esta manera, está transfiriendo la propiedad del vector desde el enum
State
a la variable localv
. Luego, está pasando la propiedad dev
a la varianteState::Bar
asignándola aself.state
.En general, no está necesariamente en contra del modelo de seguridad de Rust transferir la propiedad entre variables o estructuras de datos, pero requiere una consideración cuidadosa de las reglas de préstamo y los tiempos de vida.