No description
Find a file
2026-09-01 13:32:22 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:32:22 +02:00
src fix(024): pedagogical MINOR fixes 2026-09-01 13:32:22 +02:00
tests initial content 2026-09-01 13:32:20 +02:00
.gitignore Initial commit 2026-09-01 11:32:02 +00:00
Cargo.lock initial content 2026-09-01 13:32:20 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:32:22 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:32:22 +02:00
README.md fix(024): pedagogical MINOR fixes 2026-09-01 13:32:22 +02:00

Lição 24: Pacotes de Dados (Tuplas Avançadas)

1. Narrativa

No cockpit do mecha Æther, múltiplos sensores transmitem dados simultaneamente — temperatura, pressão, velocidade, coordenadas — tudo empacotado em uma única transmissão. Tuplas são os pacotes de dados do Rust: agrupam valores de tipos diferentes em uma unidade compacta e eficiente.

2. Conceito

Tuplas agrupam valores de tipos diferentes em uma estrutura fixa:

  • Criação: (valor1, valor2, valor3) — tipos implícitos
  • Acesso: .0, .1, .2 — indexação por posição
  • Desestruturação: let (a, b, c) = tupla — extrair em variáveis
  • Aninhamento: ((x, y), (vx, vy)) — tuplas dentro de tuplas
  • Tuple structs: struct Coordenada(f64, f64, f64) — tuplas nomeadas

3. Requisitos

  • Criar e acessar tuplas por índice (.0, .1, .2)
  • Desestruturar tuplas em variáveis nomeadas
  • Retornar múltiplos valores usando tuplas
  • Trabalhar com tuplas aninhadas e tuple structs

4. Design de Dados

graph LR
    A[Tupla f64 f64 f64] --> B[.0 → Temperatura]
    A --> C[.1 → Pressão]
    A --> D[.2 → Velocidade]
    E[Tupla Aninhada] --> F[posição: x y z]
    E --> G[velocidade: vx vy vz]
    H[Tuple Struct] --> I[Coordenada x y z]

5. Diagrama de Fluxo

flowchart TD
    A[Início] --> B[Criar pacote de sensores]
    B --> C[Acessar por índice .0 .1 .2]
    C --> D[Desestruturar em variáveis]
    D --> E{Tipo de operação?}
    E -->|Conversão| F[Polar → Cartesiano]
    E -->|Análise| G[Extrair altitude]
    E -->|Combinação| H[Combinar leituras 2D]
    F --> I[Retornar resultado]
    G --> I
    H --> I

6. Funções

Função Descrição
criar_pacote_sensores Cria tupla (temperatura, pressão, velocidade)
obter_temperatura Acessa .0 da tupla
obter_pressao Acessa .1 da tupla
obter_velocidade Acessa .2 da tupla
desestruturar_pacote Extrai valores em variáveis nomeadas
extrair_temp_pressao Extrai apenas os dois primeiros valores
inverter_coordenada Troca (x, y) para (y, x)
ler_sensor Retorna (nome, valor, status) por código
dividir_energia Divide energia em duas partes
polar_para_cartesiano Converte (raio, ângulo) para (x, y)
criar_relatorio_movimento Cria tupla aninhada posição + velocidade
obter_altitude Extrai eixo Z de tupla aninhada
obter_velocidade_vetorial Extrai velocidade completa
combinar_leituras_2d Combina duas leituras 2D em uma 3D
criar_coordenada Cria tuple struct Coordenada
desestruturar_coordenada Extrai componentes da tuple struct
distancia_entre Distância euclidiana entre duas Coordenadas
criar_pacote_telemetria Cria PacoteTelemetria
sistema_operacional Verifica se telemetria indica operacional
formatar_telemetria Formata telemetria como relatório

7. Exemplo

let pacote = (36.5, 101.3, 250.0);
let (temp, pressao, vel) = pacote;
assert_eq!(temp, 36.5);
let coord = Coordenada(1.0, 2.0, 3.0);
let Coordenada(x, y, z) = coord;

8. Missão

  1. Implementar criar_pacote_sensores retornando a tupla exata (36.5, 101.3, 250.0) — temperatura, pressão e velocidade do estado atual do mecha
  2. Implementar acesso por índice: obter_temperatura, obter_pressao, obter_velocidade
  3. Implementar desestruturar_pacote e extrair_temp_pressao
  4. Implementar inverter_coordenada com desestruturação
  5. Implementar ler_sensor com match no código
  6. Implementar dividir_energia e polar_para_cartesiano
  7. Implementar funções de tuplas aninhadas: criar_relatorio_movimento, obter_altitude, obter_velocidade_vetorial
  8. Implementar tuple structs: criar_coordenada, desestruturar_coordenada, distancia_entre
  9. Implementar criar_pacote_telemetria, sistema_operacional, formatar_telemetria

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • Tuplas são fixas em tamanho — não é possível adicionar/remover elementos
  • Desestruturação com _ ignora valores: let (a, _, c) = tupla
  • Tuple structs são úteis para dar significado sem campos nomeados
  • std::f64::consts::PI e métodos .cos(), .sin() para conversão polar