Tiempos de vida en estructuras de datos
Si un tipo de datos almacena datos prestados, se debe anotar con tiempo de vida:
#[derive(Debug)] struct Highlight<'doc>(&'doc str); fn erase(text: String) { println!("¡Adiós, {text}!"); } fn main() { let text = String::from("El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja."); let fox = Highlight(&text[4..19]); let dog = Highlight(&text[35..43]); // erase(text); println!("{fox:?}"); println!("{dog:?}"); }
This slide should take about 5 minutes.
- En el ejemplo anterior, la anotación en
Highlight
hace que los datos subyacentes a la&str
contenida tengan al menos la misma duración que cualquier instancia deHighlight
que utilice esos datos. - Si
text
se consume antes de que acabe el tiempo de vida defox
(odog
), el borrow checker (verificador de préstamos) muestra un error. - Los tipos con datos prestados (borrowed) obligan a los usuarios a conservar los datos originales. Esto puede ser útil para crear vistas ligeras aunque, por lo general, hace que sean un poco más difíciles de usar.
- Siempre que sea posible, haz que las estructuras de datos sean propietarias directas de sus datos.
- Algunas estructuras con varias referencias dentro pueden tener más de una anotación de tiempo de vida. Esto puede ser necesario si hay que describir las relaciones de tiempo de vida entre las propias referencias, además del tiempo de vida de la propia estructura. Estos son casos prácticos muy avanzados.