ps4 - rust traduccion
No se puede pedir prestado contenido prestado inmutable como mutable. (1)
Aquí está un MCVE de su problema:
use std::collections::HashMap;
struct Components {
data: HashMap<u8, Vec<u8>>,
}
impl Components {
fn add_or_update(&mut self, component: u8) {
let mut q = self.data.get(&component);
let mut queue = q.as_mut().unwrap();
queue.remove(0);
}
}
Antes NLL
error[E0596]: cannot borrow immutable borrowed content `**queue` as mutable
--> src/lib.rs:11:9
|
11 | queue.remove(0);
| ^^^^^ cannot borrow as mutable
Despues de nll
error[E0596]: cannot borrow `**queue` as mutable, as it is behind a `&` reference
--> src/lib.rs:11:9
|
11 | queue.remove(0);
| ^^^^^ cannot borrow as mutable
Muchas veces, cuando algo así parece sorprendente, es útil imprimir los tipos involucrados . Vamos a imprimir el tipo de queue
:
let mut queue: () = q.as_mut().unwrap();
error[E0308]: mismatched types
--> src/lib.rs:10:29
|
10 | let mut queue: () = q.as_mut().unwrap();
| ^^^^^^^^^^^^^^^^^^^ expected (), found mutable reference
|
= note: expected type `()`
found type `&mut &std::vec::Vec<u8>`
Tenemos una referencia mutable a una referencia inmutable a un Vec<u8>
. Debido a que tenemos una referencia inmutable al Vec
, ¡no podemos modificarlo! Cambiar self.data.get
a self.data.get_mut
cambia el tipo a &mut &mut collections::vec::Vec<u8>
y el código se compila.
Si desea implementar el concepto de "insertar o actualizar", debe ingresar en la API de entry
, que es más eficiente y concisa.
Más allá de eso, Rust usa snake_case
para nombrar los métodos, no camelCase
.
Estoy tratando de desarrollar una aplicación de enrutamiento de mensajes. He leído los documentos oficiales de Rust y algunos artículos y pensé que entendí cómo funcionan los punteros, la propiedad y los préstamos, pero me di cuenta de que no.
use std::collections::HashMap;
use std::vec::Vec;
struct Component {
address: &''static str,
available_workers: i32,
lang: i32
}
struct Components {
data: HashMap<i32, Vec<Component>>
}
impl Components {
fn new() -> Components {
Components {data: HashMap::new() }
}
fn addOrUpdate(&mut self, component: Component) -> &Components {
if !self.data.contains_key(&component.lang) {
self.data.insert(component.lang, vec![component]);
} else {
let mut q = self.data.get(&component.lang); // this extra line is required because of the error: borrowed value does not live long enough
let mut queue = q.as_mut().unwrap();
queue.remove(0);
queue.push(component);
}
self
}
}
(También disponible en el playground )
Produce el error:
error: cannot borrow immutable borrowed content `**queue` as mutable
--> src/main.rs:26:13
|
26 | queue.remove(0);
| ^^^^^ cannot borrow as mutable
error: cannot borrow immutable borrowed content `**queue` as mutable
--> src/main.rs:27:13
|
27 | queue.push(component);
| ^^^^^ cannot borrow as mutable
¿Podría por favor explicar el error y sería genial si pudiera darme la implementación correcta?