Ownership y préstamos

Forja incorpora los conceptos de ownership (propiedad) y préstamos (borrowing) de Rust, adaptados al español. Este sistema previene errores de memoria sin necesidad de un garbage collector, verificando las reglas en tiempo de compilación.

🔥 Idea central: Cada valor tiene un único dueño. Cuando asignás una variable a otra, la propiedad se transfiere (move). Si solo querés prestarla, usá &.

Mutabilidad básica

Lo más simple: las variables mutables se pueden modificar, las constantes no:

✅ vs ❌
variable contador = 0
contador = contador + 1   // ✅ OK: es mutable

constante maximo = 100
// maximo = 200  // ❌ ErrorDePropiedad: es inmutable

Referencias con &

El operador & crea una referencia (préstamo) a una variable. La variable original retiene la propiedad:

🔗 Préstamo (referencia)
variable x = 42
variable ref = &x       // préstamo: ref toma prestado x
escribir(x)              // ✅ x sigue siendo el dueño

Préstamo mutable con &mut

Si necesitás modificar un valor prestado, usá un préstamo mutable:

📝 Préstamo mutable
variable x = 42
variable ref = &mut x    // préstamo mutable
// ref puede modificar x temporalmente

Parámetro prestado

Indica que un parámetro de función se recibe por referencia, no por valor. Así la variable original no se mueve (no pierde ownership):

📥 Referencia en parámetro
funcion mostrar(prestado valor) {
    escribir("El valor es: " + valor)
}

variable dato = 100
mostrar(dato)                          // presta dato a la función
escribir("Dato sigue disponible: " + dato)  // ✅ sigue vivo
💡 Sin prestado: Si el parámetro no lleva prestado, el valor se mueve a la función y la variable original ya no se puede usar.

Errores que previene el Borrow Checker

ErrorQué detecta
Variable no declaradaUsar una variable antes de crearla
Modificar inmutableAsignar a una constante o variable no-mut
Variable movidaUsar variable después de transferir su ownership
Préstamo inválidoPrestar una variable que ya fue movida
Modificar con préstamos activosEscribir en variable que tiene referencias activas
Ambigüedad de ámbitosVariables que se solapan en scopes anidados

Ejemplo completo

📄 ownership
// Mutabilidad
variable contador = 0
contador = contador + 1
escribir("Contador: " + contador)

// Referencias y préstamos
variable x = 42
variable ref = &x
escribir("Valor de x: " + x)

// Función con parámetro prestado
funcion mostrar(prestado valor) {
    escribir("El valor es: " + valor)
}

variable dato = 100
mostrar(dato)
escribir("Dato sigue disponible: " + dato)

Equivalencia con Rust

ForjaRust
variable x = 5let mut x = 5;
constante x = 5let x = 5;
&x&x
&mut x&mut x
prestado paramparam: &Tipo
⚠️ Estado actual: El Borrow Checker de Forja está operativo para verificar declaración de variables, mutabilidad y ámbitos. El tracking completo de movimientos (move) para tipos no-Copy está en desarrollo activo.