No description
Find a file
2026-08-14 07:17:26 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-08-14 07:17:26 +02:00
src initial content 2026-08-14 07:17:20 +02:00
tests initial content 2026-08-14 07:17:20 +02:00
.gitignore Initial commit 2026-08-14 05:16:47 +00:00
Cargo.lock initial content 2026-08-14 07:17:20 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-08-14 07:17:26 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-08-14 07:17:26 +02:00
README.md initial content 2026-08-14 07:17:20 +02:00

Lição 15: Duplicação de Dados (Replicação de Componentes)

1. Narrativa

O mecha Æther possui componentes que podem ou não ser replicados. Peças simples (como parafusos) podem ser copiadas instantaneamente, mas subsistemas complexos exigem um processo de clonagem mais elaborado. Duplicação de Dados ensina o piloto quando usar Copy e Clone para duplicar valores com segurança.

2. Conceito

Rust controla a duplicação de dados através de traits:

  • Copy: Tipos simples que podem ser copiados bit-a-bit (i32, f64, bool, char, tuplas de Copy)
  • Clone: Tipos que precisam de duplicação explícita via .clone() (String, Vec)
  • Semântica de move: Tipos sem Copy são movidos, não copiados
  • Escolha consciente: O compilador impede cópias acidentais de dados caros

3. Requisitos

  • Criar funções que demonstram duplicação de dados
  • Diferenciar comportamento Copy vs Clone
  • Usar .clone() explicitamente quando necessário

4. Design de Dados

graph LR
    A[Valor Original] --> B{Implementa Copy?}
    B -->|Sim| C[Cópia automática]
    B -->|Não| D{Usou .clone?}
    D -->|Sim| E[Clone profundo]
    D -->|Não| F[Move - original invalidado]

5. Diagrama de Fluxo

flowchart TD
    A[Receber valor] --> B{Tipo é Copy?}
    B -->|Sim| C[Copiar automaticamente]
    B -->|Não| D[Precisa de clone?]
    D -->|Sim| E[Chamar .clone]
    D -->|Não| F[Mover ownership]
    C --> G[Ambas variáveis válidas]
    E --> G
    F --> H[Apenas nova variável válida]

6. Funções

Função Descrição
copiar_inteiro Demonstra cópia automática de i32
clonar_string Clona uma String explicitamente
copiar_tupla Copia tupla de tipos Copy
clonar_vetor Clona um Vec profundamente
trocar_valores Troca dois valores usando Copy
duplicar_primeiro Retorna duas cópias do primeiro elemento
juntar_copiados Soma valores copiados de um slice
clonar_e_modificar Clona string e modifica o clone

7. Exemplo

let original = String::from("mecha");
let clone = original.clone();
// Ambos são válidos e independentes
assert_eq!(original, clone);

8. Missão

  1. Implementar copiar_inteiro demonstrando cópia de i32
  2. Implementar clonar_string usando .clone()
  3. Implementar copiar_tupla com tuplas de tipos Copy
  4. Implementar clonar_vetor usando .clone() em Vec
  5. Implementar trocar_valores trocando dois i32 (Copy)
  6. Implementar duplicar_primeiro retornando duas cópias do primeiro elemento
  7. Implementar juntar_copiados somando valores copiados
  8. Implementar clonar_e_modificar clonando e modificando String

9. Como Executar

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

10. Dicas

  • Tipos primitivos implementam Copy automaticamente
  • String e Vec<T> NÃO são Copy — precisam de .clone()
  • Se um tipo contém algo não-Copy (como String), ele não pode ser Copy
  • Prefira empréstimo (borrowing) a clonagem quando possível para eficiência