¿Cómo terminar un préstamo en un partido o si se deja express?

Estoy usando un HashMap para almacenar una enumeración. Me gustaría obtener un valor de HashMap y si el valor es una variante de enumeración específica, me gustaría insertar una copia modificada del valor en el HashMap .

El código que se me ocurrió es así:

 if let Node::LeafNode(mut leaf_node) = *(self.pages.get(&page).unwrap()) { let mut leaf_node = leaf_node.clone(); // ... self.pages.insert(leaf_page,Node::LeafNode(leaf_node)); } 

Esto no se comstack porque el préstamo de self.pages dura hasta el final de if let -block y self.pages.insert es un préstamo mutable.

He intentado sombrear el valor de HashMap con una copia del valor, pero esto no termina con el préstamo. Por lo general, usaría un bloque {} para limitar el préstamo, pero parece que no es posible en el match o if let .

¿Cuál es la manera idiomática de terminar un préstamo para que pueda obtener un nuevo préstamo mutable?

Esto no es posible en este momento. Lo que quiere se llama préstamos no léxicos y todavía debe implementarse en Rust. Mientras tanto, debes usar Entry API para trabajar con mapas; en la mayoría de los casos, debería ser suficiente. En este caso particular, no estoy seguro si las entradas son aplicables, pero siempre puedes hacer algo como

 let mut result = None; if let Some(&Node::LeafNode(ref leaf_node)) = self.pages.get(&page) { let mut leaf_node = leaf_node.clone(); // ... result = Some((leaf_page, leaf_node)); } if let Some((leaf_page, leaf_node)) = result { self.pages.insert(leaf_page, leaf_node); } 

Es difícil hacer que el código anterior sea completamente correcto dado que no proporcionó definiciones de Node y self.pages , pero debería ser aproximadamente correcto. Naturalmente, solo funcionaría si leaf_page y leaf_node no contienen referencias a self.pages o self , de lo contrario no podrá acceder a self.pages .

Aquí está la solución de Vladimir usando match :

 let mut result = match self.pages.get(&page) { Some(&Node::LeafNode(ref leaf_node)) => Some(leaf_node.clone()), _ => None, }; if let Some(leaf_node) = result { // ... self.pages.insert(page_number, Node::LeafNode(leaf_node)); };