Tempos de Vida em Estruturas de Dados

Se um tipo de dados armazena dados emprestados, ele deve ser anotado com um tempo de vida:

#[derive(Debug)]
struct Destaque<'doc>(&'doc str);

fn apagar(texto: String) {
    println!("Até logo {texto}!");
}

fn main() {
    let texto = String::from("A raposa marrom ågil pula sobre o cachorro preguiçoso.");
    let raposa = Destaque(&texto[2..21]);
    let cachorro = Destaque(&texto[35..53]);
    // apagar(texto);
    println!("{raposa:?}");
    println!("{cachorro:?}");
}
  • No exemplo acima, a anotação em Destaque impĂ”e que os dados subjacentes ao &str contido vivam pelo menos tanto quanto qualquer instĂąncia de Destaque que use esses dados.
  • Se texto for consumido antes do final do tempo de vida de raposa (ou cachorro), o verificador de emprĂ©stimo lançarĂĄ um erro.
  • Tipos com dados emprestados forçam os usuĂĄrios a manter os dados originais. Isso pode ser Ăștil para criar exibiçÔes leves, mas geralmente as tornam um pouco mais difĂ­ceis de usar.
  • Quando possĂ­vel, faça com que as estruturas de dados possuam (own) seus dados diretamente.
  • Algumas structs com mĂșltiplas referĂȘncias internas podem ter mais de uma anotação de tempo de vida. Isso pode ser necessĂĄrio se houver a necessidade de descrever-se relacionamentos de tempo de vida entre as prĂłprias referĂȘncias, alĂ©m do tempo de vida da prĂłpria struct. Esses sĂŁo casos de uso bastante avançados.