Diccionario

Ownership (propiedad) en Rust

El sistema de Rust para gestionar la memoria sin recolector de basura: cada valor tiene un único dueño y se libera cuando el dueño deja de existir.

Cada valor tiene una variable dueña. Al asignarlo a otra o pasarlo a una función, la propiedad se mueve y la anterior ya no puede usarlo. Cuando el dueño sale de su ámbito, el valor se libera.

Para usar un valor sin quedártelo se toma prestado con & (lectura) o &mut (modificación). El compilador comprueba estas reglas y rechaza el código que podría provocar errores de memoria.

Un ejemplo

Tras let b = a; con un String, usar a da error al compilar: el texto ahora pertenece a b.

Por qué importa

El ownership (propiedad) es la idea central de Rust y lo que le permite gestionar la memoria sin recolector de basura y sin liberar a mano. Las reglas son pocas: cada valor tiene un único dueño, cuando el dueño sale de su ámbito el valor se libera, y el valor puede moverse a otro dueño o prestarse mediante referencias.

Lo encuentras desde tus primeras líneas de Rust, y el compilador te lo hace notar con errores que al principio parecen muros. Pero cada uno de esos errores evita en tiempo de compilación problemas que en C o C++ solo verías al ejecutar: usar memoria ya liberada, liberar dos veces o modificar un dato mientras otra parte del código lo lee. Entender ownership convierte al compilador en un aliado en lugar de un obstáculo.

Confusiones frecuentes

Lo más habitual es no distinguir mover de copiar. Con let b = a; en un String, el valor se mueve a b y a deja de ser válida; con un i32 se copia y ambas siguen valiendo, porque los tipos simples implementan Copy. Otro error típico es pensar que una referencia & es lo mismo que ser dueño: prestar un valor no transfiere la propiedad, y el compilador exige que el préstamo no sobreviva al dueño. Tampoco debe confundirse con el «ownership» de otros contextos, como ser propietario de un archivo.

Preguntas frecuentes

¿Por qué Rust dice «value borrowed after move»?

Porque has usado una variable después de mover su valor a otra parte. Soluciones: pasar una referencia (&valor), clonar con valor.clone() si necesitas dos copias, o reorganizar el código para no volver a usarla.

¿Tengo que entender ownership para usar Rust?

Sí, es la base del lenguaje. Empieza por las tres reglas (un dueño, liberación al salir del ámbito, mover o prestar) y verás que los errores del compilador suelen indicar la solución.