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 deDestaque
que use esses dados. - Se
texto
for consumido antes do final do tempo de vida deraposa
(oucachorro
), 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.