traduccion ps4 lenguaje language juego rust

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?