Lifetimes Explained
Um lifetime é o período durante o qual uma referência é válida. Parâmetros de lifetime como 'a relacionam referências em assinaturas de função e structs para que o compilador possa rejeitar ponteiros pendentes.
Receita
fn first<'a>(items: &'a [i32]) -> Option<&'a i32> {
items.first()
}
fn main() {
let data = vec![3, 1, 4];
println!("{:?}", first(&data));
}Quando usar isso: Retornar referências de funções, armazenar referências em structs ou entender erros de "não vive o suficiente".
Exemplo de Trabalho
struct Excerpt<'a> {
text: &'a str,
}
fn excerpt<'a>(full: &'a str, end: usize) -> Excerpt<'a> {
Excerpt { text: &full[..end.min(full.len())] }
}
fn main() {
let article = String::from("Rust lifetimes are compile-time checks.");
let e = excerpt(&article, 4);
println!("{}", e.text);
}O que isso demonstra:
- Struct que contém uma referência precisa de um parâmetro de lifetime
Excerpt<'a>não pode sobreviver àStringque ele empresta- O trecho retornado empresta da entrada
full - Lifetime conecta o campo da struct aos dados de origem
Mergulho Profundo
Como Funciona
- Cada referência tem um lifetime inferido ou explícito
- Lifetime
'asignifica "válido por alguma região pelo menos tão longa quanto'a" - Subtipagem: dados de vida mais longa podem satisfazer requisitos de lifetime mais curtos
- Lifetimes não são armazenados em tempo de execução
Por Que Existem
Sem lifetimes, isso compilaria de forma insegura:
// impossível em Rust seguro
// fn dangle() -> &str { let s = String::from("x"); &s }Relação com Propriedade (Ownership)
- Proprietário descartado -> empréstimos terminam
- Lifetimes codificam restrições de ordenação entre proprietários e mutuários
'staticé o lifetime mais longo (programa inteiro)
Armadilhas
- Pensar que lifetimes mudam o comportamento em tempo de execução - São apenas para análise estática. Correção: Concentre-se nas regiões de empréstimo, não em temporizadores de tempo de execução.
- Anotar todas as referências - A elisão cobre casos comuns. Correção: Anote quando o compilador solicitar ou quando as assinaturas forem API pública.
- Retornar referência de
ifcom locais diferentes - O lifetime unificado pode falhar. Correção: Retorne um valor de propriedade ou garanta que ambos os braços emprestem a mesma origem. - Structs autorreferenciais sem cuidado - Clássico ponto de tropeço. Correção: Use índices,
Pinou um grafo de propriedade (Rc). - Confundir
'staticcom imortalidade - Significa válido pela duração do programa, não que os dados nunca são liberados se vazados de outra forma. Correção: Leia a página'static.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
String de propriedade | Resultado independente necessário | Visão zero-copy necessária |
Cow<'a, str> | Talvez emprestar, talvez possuir | Sempre uma estratégia |
| Índices no buffer pai | Identificadores estáveis | Substring simples de uso único |
Arc<str> | Texto imutável compartilhado | Proprietário único é suficiente |
FAQs
Lifetimes são como gerações de GC?
Não. São rótulos em tempo de compilação para validade de empréstimo, não gerenciamento de memória em tempo de execução.
Lifetimes podem ser inferidos?
Sim, em muitos casos locais e de função através de regras de elisão.
Qual sintaxe é `'a`?
Um nome de parâmetro de lifetime. A convenção começa com 'a, 'b. Poderia ser 'line para clareza.
Todas as structs precisam de lifetimes?
Apenas aquelas que armazenam referências. Campos de propriedade não precisam de parâmetros de lifetime.
Lifetimes podem ser muito curtos?
Sim - esse é o trabalho do borrow checker pegá-lo quando uma referência ficaria pendente.
O que é lifetime de ordem superior `for<'a>`?
Quantifica sobre qualquer lifetime - usado com objetos de trait e alguns traits de função.
Lifetime em futures async?
Futures autorreferenciais usam Pin internamente; não crie manualmente sem entender.
Relação com escopos?
Escopos frequentemente se alinham com lifetimes, mas NLL encerra empréstimos antes do fim do escopo às vezes.
Posso comparar lifetimes em tempo de execução?
Não. Eles não existem em tempo de execução.
Para onde ir agora?
Anotações de Lifetime para escrever limites explicitamente.
Relacionado
- Anotações de Lifetime - escrevendo
'a - Elisão de Lifetime - regras de omissão
'static& Limites - significado de'static- Empréstimos & Referências - regras de empréstimo
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.