No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 26: Tempo de Vida (Lifetimes)
1. Narrativa
No sistema do mecha Æther, cada referência de dados tem um tempo de validade — um período durante o qual o dado pode ser acessado com segurança. Lifetimes garantem que nenhuma referência aponte para dados que já foram desativados, prevenindo falhas críticas no sistema de controle.
2. Conceito
Lifetimes ('a) são anotações que o compilador usa para verificar validade de referências:
- Anotação explícita:
<'a>— quando o compilador precisa de ajuda - Elision: Regras automáticas — uma entrada/uma saída, &self, etc.
- Structs com lifetimes:
struct Registro<'a>— a struct não pode viver mais que os dados que referencia - 'static: Tempo de vida de todo o programa — literais de string e constantes
- Bounds genéricos:
where T: Trait + 'a— combinar lifetimes com traits
3. Requisitos
- Anotar lifetimes explícitos em funções com múltiplas referências
- Entender quando elision é suficiente
- Criar structs que armazenam referências com lifetimes
- Usar 'static para dados permanentes e bounds em funções genéricas
4. Design de Dados
graph LR
A[&'a str sensor_a] --> C[fn sensor_mais_duravel]
B[&'a str sensor_b] --> C
C --> D[&'a str resultado]
E[RegistroDiagnostico 'a] --> F[nome: &'a str]
E --> G[laudo: &'a str]
H["'static"] --> I[id_sistema_central]
5. Diagrama de Fluxo
flowchart TD
A[Início] --> B{Múltiplas refs de entrada?}
B -->|Sim| C[Anotação explícita 'a]
B -->|Não| D[Elision automática]
C --> E[Struct com lifetime?]
D --> E
E -->|Sim| F["struct Registro<'a>"]
E -->|Não| G[Lifetime estático?]
F --> H[Verificar compilador]
G -->|Sim| I["'static"]
G -->|Não| H
I --> H
6. Funções
| Função | Descrição |
|---|---|
sensor_mais_duravel |
Retorna ref com lifetime explícito 'a |
primeiro_alerta |
Lifetime explícito — &[&str] tem 2 lifetimes, elisão falha (E0106) |
nome_do_modelo |
Elision: uma entrada, saída automática |
codigo_status |
Elision: entrada e saída compartilham lifetime |
RegistroDiagnostico::novo |
Cria struct com referências |
RegistroDiagnostico::resumo |
Resumo do diagnóstico |
RegistroDiagnostico::eh_critico |
Verifica criticidade ≥ 8 |
ResultadoScan::novo |
Cria resultado de scan |
ResultadoScan::registrar_anomalia |
Adiciona anomalia detectada |
ResultadoScan::total_anomalias |
Conta anomalias |
id_sistema_central |
Retorna &'static str |
protocolo_seguranca |
Retorna &'static str |
componente_maior_prioridade |
Bound genérico com lifetime + trait |
filtrar_por_prioridade |
Filtra componentes por prioridade |
7. Exemplo
fn sensor_mais_duravel<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() >= b.len() { a } else { b }
}
let resultado = sensor_mais_duravel("Sensor-Alpha", "Sensor-Beta");
let registro = RegistroDiagnostico::novo("Reator", "Operacional", 3);
8. Missão
- Implementar
sensor_mais_duravelcom lifetime'aexplícito - Implementar
primeiro_alertabuscando na slice - Implementar funções com elision:
nome_do_modelo,codigo_status - Implementar
RegistroDiagnostico:novo,resumo,eh_critico - Implementar
ResultadoScan:novo,registrar_anomalia,total_anomalias - Implementar funções 'static:
id_sistema_central,protocolo_seguranca - Implementar
componente_maior_prioridadeefiltrar_por_prioridadecom bounds genéricos
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
- Lifetimes não mudam o tempo de vida dos dados — apenas verificam segurança
- Elision aplica 3 regras: cada referência de entrada ganha um lifetime, se uma entrada então saída = entrada, se &self então saída = &self
- Structs que guardam referências PRECISAM de anotação de lifetime
'staticnão significa "vive para sempre no heap" — significa "vive por toda a execução do programa"- Avançado (Lição 28):
componente_maior_prioridade<T>efiltrar_por_prioridade<T>usam parâmetros genéricos<T>— você os estudará na Lição 28. Por ora, trateTcomo "qualquer tipo" que implemente o traitPrioridadeComponente - Avançado (Lição 29): o trait
PrioridadeComponente(comwhere T: PrioridadeComponente) é um trait bound — você estudará traits em detalhe na Lição 29. O trait já é fornecido; você só precisa implementar as funções que o usam - Exceção ao "prefira elisão":
fn f(alertas: &[&str]) -> Option<&str>rejeita elisão comE0106. A slice&[&str]esconde dois lifetimes de entrada (o da referência externa e o dos elementos&strinternos), e a regra que propaga o lifetime de entrada para a saída só dispara quando há exatamente um. A anotação<'a>amarra explicitamente a saída ao lifetime da slice. É exatamente o caso deprimeiro_alerta— ver a explicação na sua doc comment.