Anotações de Tempo de Vida
Anotações explícitas de tempo de vida informam ao compilador como os parâmetros de referência e os valores de retorno se relacionam. Elas aparecem em assinaturas de funções, structs, enums e impls de traits.
Busque em todas as páginas da documentação
Anotações explícitas de tempo de vida informam ao compilador como os parâmetros de referência e os valores de retorno se relacionam. Elas aparecem em assinaturas de funções, structs, enums e impls de traits.
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
fn main() {
let s = String::from("abcd");
let slice = longest(&s, "xy");
println!("{slice}");
}Quando usar isso: APIs públicas que retornam referências, structs que contêm empréstimos e para resolver erros de tempo de vida que o compilador não consegue elidir.
struct Parser<'a> {
input: &'a str,
}
impl<'a> Parser<'a> {
fn new(input: &'a str) -> Self {
Self { input }
}
fn peek_word(&self) -> Option<&'a str> {
self.input.split_whitespace().next()
}
}
fn main() {
let text = String::from("hello world");
let p = Parser::new(&text);
println!("{:?}", p.peek_word());
}O que isso demonstra:
impl<'a> repete o tempo de vida no bloco impl&'a str vinculado à entrada do parserParser não pode sobreviver a textfn split<'a>(s: &'a str, at: usize) -> (&'a str, &'a str) {
s.split_at(at)
}struct Pair<'a, 'b> {
first: &'a str,
second: &'b str,
}Cada campo pode emprestar de fontes diferentes.
fn copy_str<'a: 'b, 'b>(x: &'a str, y: &'b mut &str) {
*y = x;
}'a: 'b significa que 'a vive mais que 'b.
implParâmetros de tempo de vida em impl devem corresponder à definição da struct/trait quando os métodos retornam dados internos emprestados.
'a a todas as referências relacionadas.'a, 'b separados quando as fontes diferirem.impl com referências - Erro de compilação nos métodos. Correção: impl<'a> Struct<'a>.fn dentro de impl sem necessidade - Ruído. Correção: Use a elisão quando o compilador aceitar.'a define a duração - Você declara relacionamentos; o compilador verifica os pontos de chamada. Correção: Leia os erros como falhas de restrição.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Campos de propriedade | Sem acoplamento de empréstimo | Necessita de visualização sem cópia |
AsRef<str> genérico | Aceita muitos tipos de string | O tipo de retorno ainda empresta |
Índices + Vec pai | Grafos autorreferenciais | API de substring simples |
Arc<str> | Armazenamento imutável compartilhado | String de proprietário único |
Não. A elisão e a inferência lidam com muitos casos. Anote quando for necessário.
Sim: 'line, 'input. 'a é a convenção para o primeiro parâmetro.
Mesmas regras. O tempo de vida do empréstimo exclusivo está vinculado ao proprietário.
As definições de trait podem incluir parâmetros de tempo de vida; os impls devem corresponder.
Às vezes, com elisão de tempo de vida em structs (raro). Frequentemente, o explícito é mais claro.
Instrui a inferência a preencher o tempo de vida em posições ambíguas: Parser<'_>.
Todas as entradas que compartilham o tempo de vida de saída devem viver o suficiente - unifique com 'a.
Closures geralmente inferem. Closures de movimento podem precisar de explicitação onde na função externa.
Futures de retorno podem capturar tempos de vida; prefira capturas de propriedade em async quando possível.
rust-analyzer mostra os tempos de vida necessários nas assistências de assinatura.
'static & Limites - limites de sobrevivênciaVersõ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