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 Highlight<'doc>(&'doc str);

fn erase(text: String) {
    println!("Até logo {text}!");
}

fn main() {
    let text = String::from("The quick brown fox jumps over the lazy dog.");
    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.
  • No exemplo acima, a anotação em Highlight impĂ”e que os dados subjacentes ao &str contido vivam pelo menos tanto quanto qualquer instĂąncia de Highlight que use esses dados.
  • Se text for consumido antes do final do tempo de vida de fox (ou dog), o borrow checker (verificador de emprĂ©stimo) lançarĂĄ um erro.
  • Tipos com borrowed data (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.