¿Cuáles son las opciones para finalizar un préstamo mutable en Rust?
borrow-checker (1)
Estoy luchando con el verificador de préstamos, me pregunto o me pregunto.
Si bien encontré una solución agregando un bloque, tengo curiosidad por saber si hay otras formas de finalizar un préstamo mutable para que la siguiente declaración pueda acceder a un enlace posterior.
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 bloque alrededor del enlace de un objeto
CanvasRenderer
y después de mutar el lienzo y el alcance finaliza, el
CanvasRenderer
muere y mi
canvas
prestado mutable está disponible para leerlo 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. Antes de Rust 2018 (disponible en Rust 1.31) todos los préstamos son léxicos, es decir, siempre corresponden a algún alcance léxico. El único alcance que es más grande que una sola declaración es el de un bloque, por lo que los bloques son su única herramienta para limitar los ámbitos de préstamo.
drop()
no funcionaría por dos razones: primero, porque requeriría un alcance no léxico que no es compatible antes de Rust 2018, y segundo, no puede ser una herramienta de uso general para administrar préstamos: por ejemplo, no poder finalizar un préstamo
inmutable
simplemente porque las referencias inmutables son
Copy
y no se pueden "descartar".
Ver también:
- ¿La variable movida sigue tomando prestado después de llamar a ''drop''?
- ¿Qué son las vidas no léxicas?