Por qué existen los lifetimes
Prevenir referencias colgantes
Por qué existen los lifetimes es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.
Las referencias deben seguir siendo válidas
Una referencia toma prestados datos que no posee. Rust debe garantizar que los datos vivan al menos tanto como la referencia. Los tiempos de vida son el mecanismo con el que el compilador realiza este seguimiento.
Su función es evitar las referencias colgantes.
¿Qué es una referencia colgante?
Una referencia colgante apunta a memoria que ya se ha liberado. En lenguajes sin comprobaciones, usarla provoca fallos o problemas de seguridad. Rust se niega a compilar ese código.
El comprobador de préstamos en acción
Este código crearía una referencia a un valor cuyo ámbito termina. Rust lo rechaza en tiempo de compilación. Los tiempos de vida son la regla que utiliza para decidirlo.
fn main() {
let r;
{
let x = 5;
r = &x;
println!("inside: {}", r);
}
// using r here would be a dangling reference
println!("done");
}Los ámbitos definen los tiempos de vida
El tiempo de vida de un valor es el periodo durante el que es válido, normalmente su ámbito. Una referencia no debe vivir más que el valor al que apunta.
Aquí tanto x como la referencia viven en el mismo ámbito, por lo que no hay problema.
fn main() {
let x = 5;
let r = &x;
println!("x is {}, r is {}", x, r);
}Devolver referencias
Una función que devuelve una referencia debe devolver una que siga siendo válida para quien la llama. No puede devolver una referencia a una variable local, porque esta deja de existir cuando termina la función.
Devolver un préstamo de una entrada
Lo que sí puede hacer es devolver una referencia que tome prestada de una entrada. El resultado es válido mientras lo sea esa entrada. Esto es exactamente lo que describen las anotaciones de tiempo de vida.
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
if b == b' ' {
return &s[..i];
}
}
s
}
fn main() {
let sentence = String::from("hello world");
println!("{}", first_word(&sentence));
}Los tiempos de vida solo existen en tiempo de compilación
Los tiempos de vida son un concepto puramente de tiempo de compilación. No añaden ningún coste en tiempo de ejecución y solo existen para que el comprobador de préstamos verifique la seguridad de la memoria.
Propiedad y tiempos de vida en conjunto
La propiedad determina quién libera un valor; los tiempos de vida determinan cuánto pueden durar los préstamos de ese valor. Juntos permiten que Rust garantice la seguridad sin un recolector de basura.
fn main() {
let data = vec![1, 2, 3];
let view = &data[0..2];
println!("{:?}", view);
// data still owns the vector; view just borrows part of it
println!("{:?}", data);
}Por qué aparecen nombres en las firmas
Cuando una función recibe varias referencias, a veces el compilador no puede determinar qué relación existe entre sus tiempos de vida. Entonces debe añadir anotaciones de tiempo de vida para aclarar esas relaciones.
La siguiente lección explica esa sintaxis.
La ventaja
Gracias a los tiempos de vida, toda una categoría de errores —uso después de liberar, punteros colgantes e invalidación de iteradores— simplemente no puede compilarse. Obtiene una velocidad similar a la de C con seguridad de memoria.
Modelo mental
Imagine el tiempo de vida como una etiqueta que indica cuánto tiempo permanecen vivos los datos. Una referencia lleva esta restricción: solo es válida mientras su origen siga vivo. El comprobador de préstamos la hace cumplir.
Comprobación rápida
Compruebe cuánto entiende por qué existen los tiempos de vida.
Resumen
Ha aprendido por qué existen los tiempos de vida:
- Las referencias no deben vivir más que los datos que toman prestados
- Los tiempos de vida evitan las referencias colgantes en tiempo de compilación
- Solo existen en tiempo de compilación y no tienen coste en tiempo de ejecución
- Trabajan junto con la propiedad para garantizar la seguridad de la memoria sin un GC
Preguntas frecuentes
¿La lección «Por qué existen los lifetimes» es gratis?
Sí — el texto completo de «Por qué existen los lifetimes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.
¿Qué aprenderé en «Por qué existen los lifetimes»?
Prevenir referencias colgantes Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Learn Rust Coding?
No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Por qué existen los lifetimes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?
Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué existen los lifetimes
- Anotaciones de lifetime
- Lifetimes en structs
- Reglas de elisión