Elisão de Lifetimes
A elisão de lifetimes permite que você omita anotações explícitas de 'a em padrões comuns. O compilador aplica três regras para inferir relações entre referências em assinaturas de função.
Busque em todas as páginas da documentação
A elisão de lifetimes permite que você omita anotações explícitas de 'a em padrões comuns. O compilador aplica três regras para inferir relações entre referências em assinaturas de função.
fn first_word(s: &str) -> &str {
s.split_whitespace().next().unwrap_or("")
}
fn main() {
let line = String::from("hello world");
println!("{}", first_word(&line));
}Quando usar isso: Escrever APIs limpas sem 'a redundante quando as regras de elisão cobrem sua assinatura.
struct Buffer<'a> { data: &'a [u8] }
impl<'a> Buffer<'a> {
fn get(&self, i: usize) -> Option<&u8> {
self.data.get(i)
}
fn slice(&self, range: std::ops::Range<usize>) -> Option<&[u8]> {
self.data.get(range)
}
}
fn main() {
let bytes = [1u8, 2, 3];
let buf = Buffer { data: &bytes };
println!("{:?}", buf.slice(0..2));
}O que isso demonstra:
&self'a nas assinaturas de get ou slicebufimpl<'a> ainda é necessário na struct com parâmetro de lifetime&self), ele é atribuído a todas as saídas.&self, a saída empresta de self.// Elidido: fn foo(s: &str) -> &str
// Desugared: fn foo<'a>(s: &'a str) -> &'a str
// Método elidido: fn bar(&self, x: &str) -> &str
// A saída empresta de self, não de x (regra 3)&self - deve ser anotado.self - Precisa de lifetimes explícitos. Correção: fn merge<'a>(&self, other: &'a str) -> &'a str etc.&self para &mut self sutilmente - A elisão ainda se aplica, mas as regras de empréstimo diferem. Correção: Verifique novamente os conflitos.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
'a explícito em tudo | Clareza da API pública | Métodos simples onde a elisão funciona |
Retornar String possuída | Evitar acoplamento de lifetime | Caminho crítico precisa de empréstimo |
| Tipo associado de saída | APIs de trait complexas | fn simples é suficiente |
| GATs (avançado) | Empréstimos semelhantes a iteradores | Assinaturas simples estáveis |
Closures inferem lifetimes de forma diferente; as regras de elisão são para itens fn/impl.
Não. Campos de struct com referências precisam de parâmetros de lifetime explícitos.
Falha na elisão - múltiplos inputs, saída ambígua. Anote: <'a>.
Com &self e outra referência, a saída é de self de acordo com a regra 3.
O desugaring assíncrono adiciona um lifetime oculto no Future de retorno; prefira capturas 'static quando possível.
As regras centrais de elisão são estáveis; sempre verifique com o compilador em novas assinaturas.
Às vezes. Traits públicos podem documentar lifetimes explícitos para legibilidade.
Tipos de retorno opacos têm regras separadas; empréstimos internos ainda devem ser válidos.
rustc -Zunpretty=expanded ou confie no hover do rust-analyzer em erros.
Sempre que o compilador rejeitar uma assinatura elidida - a próxima página são as anotações.
'a explícitoVersõ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: 19 de jul. de 2026