Pular para o conteúdo

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.

fn main() {
let age = 20;
if age >= 18 {
println!("Você pode votar");
}
}
▶ Experimente você mesmo

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ão if (age >= 18).
  • A condição precisa ser um bool de verdade. if age (um número) não compila; você precisa de algo como if age != 0.
fn main() {
let age = 15;
if age >= 18 {
println!("Você pode votar");
} else {
println!("Ainda não tem idade para votar");
}
}
▶ Experimente você mesmo
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");
}
}
▶ Experimente você mesmo

O Rust verifica cada condição de cima para baixo e executa a primeira que for verdadeira, exatamente como você esperaria.

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}");
}
▶ Experimente você mesmo

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).

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 caminhada
Combinado: vá dar uma caminhada
O tempo está bom
▶ Experimente você mesmo

Aninhar 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.

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 é ímpar
▶ Experimente você mesmo

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: $7
▶ Experimente você mesmo
  • if condição { ... }: não precisa de parênteses, e a condição tem que ser um bool.
  • Encadeie mais verificações com else if e use else como alternativa final.
  • Junte condições com && e || em vez de aninhar um if dentro de outro.
  • O if pode ser usado como expressão para produzir um valor: os dois ramos precisam ter o mesmo tipo, e você precisa de um else.

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