If...Else em Rust
O if permite que seu programa tome decisões: rodar um bloco de código ou outro, dependendo de uma condição.
if básico
Seção intitulada “if básico”fn main() { let age = 20;
if age >= 18 { println!("Você pode votar"); }}Algumas coisas para reparar, porque costumam confundir quem vem de outras linguagens:
- Não há parênteses em volta da condição:
if age >= 18, e nãoif (age >= 18). - A condição precisa ser um
boolde verdade.if age(um número) não compila; você precisa de algo comoif age != 0.
if / else
Seção intitulada “if / else”fn main() { let age = 15;
if age >= 18 { println!("Você pode votar"); } else { println!("Ainda não tem idade para votar"); }}else if para mais caminhos
Seção intitulada “else if para mais caminhos”fn main() { let score = 72;
if score >= 90 { println!("Nota: A"); } else if score >= 75 { println!("Nota: B"); } else if score >= 60 { println!("Nota: C"); } else { println!("Nota: F"); }}O Rust verifica cada condição de cima para baixo e executa a primeira que for verdadeira, exatamente como você esperaria.
Usando o if como expressão
Seção intitulada “Usando o if como expressão”Aqui está algo que o Rust faz e muitas linguagens não fazem: o if pode produzir um valor. Isso significa que você pode usá-lo do lado direito de um let:
fn main() { let age = 20; let status = if age >= 18 { "adulto" } else { "menor de idade" };
println!("{status}");}Funciona do mesmo jeito que retornar um valor de uma função: sem ponto e vírgula depois do valor em cada ramo. A única exigência é que os dois ramos produzam o mesmo tipo (aqui, os dois são &str).
Combinando condições em vez de aninhar
Seção intitulada “Combinando condições em vez de aninhar”Você pode colocar um if dentro de outro if. Funciona, mas com dois ou três níveis fica difícil de ler. Muitas vezes dá para juntar as condições com os operadores lógicos && (e) e || (ou):
fn main() { let temperature = 22; let is_raining = false;
// Aninhado: funciona, mas vai escorregando para a direita if temperature > 15 { if !is_raining { println!("Aninhado: vá dar uma caminhada"); } }
// A mesma verificação como uma única condição if temperature > 15 && !is_raining { println!("Combinado: vá dar uma caminhada"); }
// || é verdadeiro se qualquer um dos lados for verdadeiro if temperature < 0 || temperature > 35 { println!("Fique em casa"); } else { println!("O tempo está bom"); }}Saída:
Aninhado: vá dar uma caminhadaCombinado: vá dar uma caminhadaO tempo está bomAninhar ainda faz sentido quando o bloco de dentro faz algo a mais, ou quando ele tem o seu próprio else. Mas quando o único papel do if de fora é proteger o de dentro, o && diz a mesma coisa de um jeito mais simples. Para verificar se um número está dentro de uma faixa, escreva temperature >= 15 && temperature <= 25. O Rust não aceita 15 <= temperature <= 25.
Prática
Seção intitulada “Prática”1. Par ou ímpar
Seção intitulada “1. Par ou ímpar”Guarde um número n = 7. Use o if como expressão para definir uma variável kind como "par" ou "ímpar" e depois imprima 7 é ímpar. Dica: um número é par quando n % 2 == 0.
Ver solução
fn main() { let n = 7; let kind = if n % 2 == 0 { "par" } else { "ímpar" }; println!("{n} é {kind}");}Saída:
7 é ímpar2. Preço do ingresso
Seção intitulada “2. Preço do ingresso”Um cinema cobra 5 dólares de crianças com menos de 12 anos, 7 de pessoas com 65 anos ou mais e 12 de todo o resto. Guarde uma idade age de 70, calcule o preço price com uma única expressão if / else if / else e imprima Ingresso: $7. Dica: todo ramo precisa devolver um número, e o if inteiro termina com um ponto e vírgula depois da última }.
Ver solução
fn main() { let age = 70;
let price = if age < 12 { 5 } else if age >= 65 { 7 } else { 12 };
println!("Ingresso: ${price}");}Saída:
Ingresso: $7if condição { ... }: não precisa de parênteses, e a condição tem que ser umbool.- Encadeie mais verificações com
else ife useelsecomo alternativa final. - Junte condições com
&&e||em vez de aninhar umifdentro de outro. - O
ifpode ser usado como expressão para produzir um valor: os dois ramos precisam ter o mesmo tipo, e você precisa de umelse.
Teste o que aprendeu
Seção intitulada “Teste o que aprendeu”Teste o que aprendeu
1. Qual destas é uma exigência para a condição de um if em Rust?
2. Ao usar o if como expressão com let, o que se exige dos dois ramos?
Pontuação: 0 / 2
Para saber mais
Seção intitulada “Para saber mais”ifExpressions — The Rust Book (em inglês): o passo a passo oficial deif,else ife do uso deifem umlet.- if/else — Rust by Example (em inglês): um exemplo que você pode rodar, mostrando ramos que produzem um valor.
- If expressions — The Rust Reference (em inglês): as regras exatas, para quando você quiser os detalhes precisos.
- Rust no Exercism (em inglês): exercícios práticos gratuitos com mentoria; os primeiros usam bastante
ifeelse.