es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtengo una referencia mutable de un vector?

Tanto los métodos run como send necesitan un objeto self, y la función send también necesita una referencia mutable de Packet:

struct Package {
    id: u32,
}

impl Package {
    fn new(id: u32) -> Package {
        Package { id }
    }
}

struct Manager {
    packages: Vec<Package>,
}

impl Manager {
    fn new() -> Manager {
        Manager {
            packages: vec![
                Package::new(1),
                Package::new(2),
                Package::new(3),
                Package::new(4),
            ],
        }
    }
    fn run(&mut self) {
        for package in self.packages.iter_mut() {
            if package.id == 1 {
                self.send(package);
            }
            println!("{}", package.id);
        }
    }
    fn send(&self, package: &mut Package) {
        package.id = 23;
    }
}

fn main() {
    let mut manager = Manager::new();
    manager.run();
}

<p>“`none
error[E0502]: cannot borrow *self as immutable because it is also borrowed as mutable
–> src/main.rs:29:17
|
27 | for package in self.packages.iter_mut() {
| ————————
| |
| mutable borrow occurs here
| mutable borrow later used here
28 | if package.id == 1 {
29 | self.send(package);
| ^^^^ immutable borrow occurs here

error[E0596]: cannot borrow manager as mutable, as it is not declared as mutable
–> src/main.rs:41:5
|
40 | let manager = Manager::new();
| ——- help: consider changing this to be mutable: mut manager
41 | manager.run();
| ^^^^^^^ cannot borrow as mutable
“`

¿Cómo puedo refactorizar estas dos funciones para que funcionen?

No quiero copiar el paquete, ya que eso causaría muchos problemas con mi código original.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el primer error, necesitamos cambiar la firma del método ‘send’ para tomar una referencia mutable de ‘self’ en lugar de una referencia inmutable:

    fn send(&mut self, package: &mut Package) {
        package.id = 23;
    }
    

    Esto nos permite tomar prestado ‘self’ mutuamente en ‘run’, y también pasar una referencia mutable a ‘send’.

    Para solucionar el segundo error, necesitamos declarar ‘manager’ como mutable en ‘main’:

    let mut manager = Manager::new();
    

    Esto nos permite llamar a ‘run’ en él y tomar prestados sus datos de forma mutable.

    El código final se vería así:

    “`rust
    struct Package {
    id: u32,
    }

    impl Package {
    fn new(id: u32) -> Package {
    Package { id }
    }
    }

    struct Manager {
    packages: Vec,
    }

    impl Manager {
    fn new() -> Manager {
    Manager {
    packages: vec![
    Package::new(1),
    Package::new(2),
    Package::new(3),
    Package::new(4),
    ],
    }
    }
    fn run(&mut self) {
    for package in self.packages.iter_mut() {
    if package.id == 1 {
    self.send(package);
    }
    println!(“{}”, package.id);
    }
    }
    fn send(&mut self, package: &mut Package) {
    package.id = 23;
    }
    }

    fn main() {
    let mut manager = Manager::new();
    manager.run();
    }
    “`

Comments are closed.