Médio Rust

Shadowing e tipos diferentes

Enunciado

Escreva um programa que comece com uma variável numero do tipo inteiro, calcule seu dobro e depois use shadowing para transformar numero em uma string que descreva o resultado. Imprima a string final.

Requisitos

  • A variável original numero deve ser um inteiro (ex.: 7).
  • O dobro deve ser calculado e armazenado em uma nova variável usando shadowing.
  • A variável final deve ser do tipo String ou &str e conter a mensagem O dobro de 7 é 14.

Código inicial

fn main() {
    let numero = 7;
    // complete com shadowing
}

Saída esperada

O dobro de 7 é 14
Ver dica

Use let numero = numero * 2; e depois let numero = format!("O dobro de {} é {}", 7, numero);.

Mostrar solução
fn main() {
    let numero = 7; // inteiro imutável
    let numero = numero * 2; // shadowing: nova variável i32 com o dobro
    let numero = format!("O dobro de 7 é {}", numero); // shadowing: agora &String
    println!("{numero}");
}

Passo a passo

  1. let numero = 7; cria uma variável imutável do tipo i32 (inferido).
  2. let numero = numero * 2; usa shadowing para criar uma nova variável numero com o valor 14. A variável anterior ainda existe, mas fica inacessível pelo nome.
  3. let numero = format!("O dobro de 7 é {}", numero); cria outra variável numero, agora do tipo String, contendo a mensagem formatada.
  4. println!("{numero}"); imprime a string final.

Por que funciona

O shadowing permite reutilizar o mesmo nome sem precisar criar nomes como numero_dobro ou numero_str. Cada let introduz uma nova variável que pode ter um tipo diferente. Isso é útil para transformar dados mantendo a legibilidade.

Erros comuns

  • Tentar alterar a variável original sem mut: numero = numero * 2; causa erro se numero não for mut. Shadowing resolve sem precisar de mut.
  • Esquecer de usar let na segunda declaração: numero = numero * 2; tenta atribuir a uma variável imutável e falha.
  • Usar format! incorretamente: format!("O dobro de {} é {}", 7, numero) está correto, mas format!("O dobro de {numero} é {numero}") repetiria o valor final.

Outra forma de resolver

Se você preferir manter o tipo inteiro e apenas imprimir a mensagem, pode fazer sem shadowing:

fn main() {
    let numero = 7;
    let dobro = numero * 2;
    println!("O dobro de {} é {}", numero, dobro);
}

Essa forma é mais direta quando não há necessidade de reutilizar o nome.

Saída esperada

O dobro de 7 é 14