sirve que para ipmt estructuras español ejemplos arreglo anidadas struct rust borrow-checker

struct - que - ipmt excel español



Desestructurar una estructura que contiene un préstamo en un argumento de función (0)

Estoy tratando de implementar un sistema que usaría cheques prestados / tiempo de vida para proporcionar índices personalizados seguros en una colección. Considera el siguiente código:

struct Graph(i32); struct Edge<''a>(&''a Graph, i32); impl Graph { pub fn get_edge(&self) -> Edge { Edge(&self, 0) } pub fn split(&mut self, Edge(_, edge_id): Edge) { self.0 = self.0 + edge_id; } pub fn join(&mut self, Edge(_, edge0_id): Edge, Edge(_, edge1_id): Edge) { self.0 = self.0 + edge0_id + edge1_id; } } fn main() { let mut graph = Graph(0); let edge = graph.get_edge(); graph.split(edge) }

Las referencias al gráfico tomado en préstamo por la estructura Edge deben descartarse cuando se invocan métodos como split o join . Esto cumpliría la constante de API que todos los índices de borde deben destruirse cuando el gráfico está mutado. Sin embargo, el compilador no lo entiende. No funciona con mensajes como

error[E0502]: cannot borrow `graph` as mutable because it is also borrowed as immutable --> src/main.rs:23:5 | 22 | let edge = graph.get_edge(); | ----- immutable borrow occurs here 23 | graph.split(edge) | ^^^^^ mutable borrow occurs here 24 | } | - immutable borrow ends here

Si entiendo esto correctamente, el compilador no se da cuenta de que el préstamo del gráfico que sucedió en la estructura de borde en realidad se está liberando cuando se llama a la función. ¿Hay alguna manera de enseñarle al compilador lo que estoy tratando de hacer aquí?

Pregunta adicional: ¿hay alguna forma de hacer exactamente lo mismo pero sin tomar prestado el gráfico en la estructura Edge ? La estructura de borde solo se usa como temporal para el cruce y nunca será parte de un estado de objeto externo (tengo versiones ''débiles'' del borde para eso).

Adición : después de algunas investigaciones, parece estar lejos de ser trivial. En primer lugar, Edge(_, edge_id) realidad no desestructura el Edge , porque _ no se enlaza en absoluto (sí, i32 es Copy, lo que hace las cosas aún más complicadas, pero esto se remedia fácilmente al envolverlo en un non- Copiar struct). En segundo lugar, incluso si desestructura completamente Edge (es decir, haciéndolo en un ámbito diferente), la referencia al gráfico aún está allí, aunque debería haberse movido (esto debe ser un error). Solo funciona si realizo la desestructuración en una función separada. Ahora, tengo una idea de cómo eludirlo (al tener un objeto separado que describe un cambio de estado y desestructura los índices a medida que se suministran), pero esto se torna muy incómodo muy rápidamente.