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 deHighlight
que use esses dados. - Se
text
for consumido antes do final do tempo de vida defox
(oudog
), 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.