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
numerodeve 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
Stringou&stre conter a mensagemO 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
let numero = 7;cria uma variável imutável do tipoi32(inferido).let numero = numero * 2;usa shadowing para criar uma nova variávelnumerocom o valor 14. A variável anterior ainda existe, mas fica inacessível pelo nome.let numero = format!("O dobro de 7 é {}", numero);cria outra variávelnumero, agora do tipoString, contendo a mensagem formatada.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 senumeronão formut. Shadowing resolve sem precisar demut. - Esquecer de usar
letna 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, masformat!("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