Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.