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.
Receita
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.
Exemplo de Trabalho
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- Métodos retornam
&'a strvinculado à entrada do parser Parsernão pode sobreviver atext- Mesmo tempo de vida em todas as referências vinculadas
Mergulho Profundo
Anotações de Função
fn split<'a>(s: &'a str, at: usize) -> (&'a str, &'a str) {
s.split_at(at)
}Struct com Múltiplos Tempos de Vida
struct Pair<'a, 'b> {
first: &'a str,
second: &'b str,
}Cada campo pode emprestar de fontes diferentes.
Limites de Tempo de Vida
fn copy_str<'a: 'b, 'b>(x: &'a str, y: &'b mut &str) {
*y = x;
}'a: 'b significa que 'a vive mais que 'b.
Tempos de Vida impl
Parâmetros de tempo de vida em impl devem corresponder à definição da struct/trait quando os métodos retornam dados internos emprestados.
Armadilhas
- Anotar apenas o tempo de vida de retorno - As entradas precisam de conexão. Correção: Adicione
'aa todas as referências relacionadas. - Tempos de vida não relacionados forçados a serem iguais - Sobrecarrega a API. Correção: Use
'a,'bseparados quando as fontes diferirem. - Tempo de vida ausente em struct
implcom referências - Erro de compilação nos métodos. Correção:impl<'a> Struct<'a>. - Tempo de vida em
fndentro deimplsem necessidade - Ruído. Correção: Use a elisão quando o compilador aceitar. - Pensar que
'adefine a duração - Você declara relacionamentos; o compilador verifica os pontos de chamada. Correção: Leia os erros como falhas de restrição.
Alternativas
| 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 |
FAQs
Todo referência deve ter `'a` escrito?
Não. A elisão e a inferência lidam com muitos casos. Anote quando for necessário.
Os tempos de vida podem ser nomeados descritivamente?
Sim: 'line, 'input. 'a é a convenção para o primeiro parâmetro.
E os tempos de vida de `&mut`?
Mesmas regras. O tempo de vida do empréstimo exclusivo está vinculado ao proprietário.
Tempo de vida em métodos de trait?
As definições de trait podem incluir parâmetros de tempo de vida; os impls devem corresponder.
Posso omitir o tempo de vida da struct com uma única referência?
Às vezes, com elisão de tempo de vida em structs (raro). Frequentemente, o explícito é mais claro.
O que é o placeholder `'_`?
Instrui a inferência a preencher o tempo de vida em posições ambíguas: Parser<'_>.
Múltiplas referências retornando uma?
Todas as entradas que compartilham o tempo de vida de saída devem viver o suficiente - unifique com 'a.
Anotações em closures?
Closures geralmente inferem. Closures de movimento podem precisar de explicitação onde na função externa.
Os tempos de vida de `async fn` diferem?
Futures de retorno podem capturar tempos de vida; prefira capturas de propriedade em async quando possível.
Ajuda de ferramentas?
rust-analyzer mostra os tempos de vida necessários nas assistências de assinatura.
Relacionado
- Elisao de Tempo de Vida - quando omitir
- Tempos de Vida Explicados - modelo conceitual
'static& Limites - limites de sobrevivência- Cenários de Incompatibilidade de Tempo de Vida - correções
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+.