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.
Busque em todas as páginas da documentação
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.
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".
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:
Excerpt<'a> não pode sobreviver à String que ele emprestafull'a significa "válido por alguma região pelo menos tão longa quanto 'a"Sem lifetimes, isso compilaria de forma insegura:
// impossível em Rust seguro
// fn dangle() -> &str { let s = String::from("x"); &s }'static é o lifetime mais longo (programa inteiro)if com 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.Pin ou um grafo de propriedade (Rc).'static com 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.| 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 |
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.
Sim, em muitos casos locais e de função através de regras de elisão.
Um nome de parâmetro de lifetime. A convenção começa com 'a, 'b. Poderia ser 'line para clareza.
Apenas aquelas que armazenam referências. Campos de propriedade não precisam de parâmetros de lifetime.
Sim - esse é o trabalho do borrow checker pegá-lo quando uma referência ficaria pendente.
Quantifica sobre qualquer lifetime - usado com objetos de trait e alguns traits de função.
Futures autorreferenciais usam Pin internamente; não crie manualmente sem entender.
Escopos frequentemente se alinham com lifetimes, mas NLL encerra empréstimos antes do fim do escopo às vezes.
Não. Eles não existem em tempo de execução.
Anotações de Lifetime para escrever limites explicitamente.
'a'static & Limites - significado de 'staticVersõ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+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026