¿Cuáles son las opciones para finalizar un préstamo mutable en Rust?

Estoy luchando con el corrector de préstamos – maravilla de maravilla.

Mientras encontré una solución al agregar un cierre, tengo curiosidad de saber si hay otras maneras de finalizar un préstamo mutable, por lo que la siguiente statement puede acceder a un enlace después.

Esto es lo que hice hasta ahora:

let mut canvas: Canvas = Canvas { width: 5, height: 5, array: vec!['x'; 5*5], }; { let mut renderer: CanvasRenderer = CanvasRenderer::new(&mut canvas); renderer.render_point('x', 3, 3); } println!("The Value in the array is: {}", canvas.array[9]); 

CanvasRenderer un cierre alrededor de la unión de un objeto CanvasRenderer y después de mutar el canvas y el CanvasRenderer termina, el CanvasRenderer muere y mi canvas mutable prestado está disponible para ser leído o lo que sea.

Esto funciona, pero ahora me gustaría ver otras soluciones.

Escuché sobre drop(stuff) pero no funcionó como pensé que debería.

No hay otra manera. Usar bloques es la forma de hacerlo. Actualmente en Rust todos los préstamos son léxicos, es decir, siempre corresponden a algún scope léxico. El único scope que es más grande que una sola statement es el de un bloque, por lo que los bloques son su única herramienta para limitar los ámbitos de endeudamiento.

drop() no funcionaría por dos razones: primero, porque requeriría un scope no léxico que no está soportado en Rust (todavía), y segundo, no puede ser una herramienta de propósito general para administrar préstamos: por ejemplo, no lo haría No se puede finalizar un préstamo inmutable simplemente porque las referencias inmutables son Copy y no se pueden “descartar”. Entonces, si obtenemos préstamos no léxicos, drop() puede funcionar para préstamos mutables, pero dudo que sea un enfoque idiomático.

Dicho esto, en la actualidad, las partes internas de Rust están sometidas a una refactorización de MIR, una representación intermedia especial de su código que, en particular, debería facilitar el razonamiento sobre los ámbitos de endeudamiento. Hasta donde recuerdo, todo el trabajo sobre préstamos no léxicos se pospuso hasta que MIR esté listo; después, creo, tales cambios serían mucho más fáciles de hacer.