¿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.
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:
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’:
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();
}
“`