Médio Rust

Classificação com bloco como valor

Enunciado

Escreva uma função classifica_idade(idade: u32) -> &'static str que retorne:

  • "Criança" se idade < 12
  • "Adolescente" se 12 <= idade < 18
  • "Adulto" se idade >= 18

Use um bloco if como expressão para determinar o retorno.

Requisitos

  • A função deve se chamar classifica_idade e receber u32.
  • Deve retornar &'static str.
  • Deve usar um bloco if/else if/else como expressão de retorno.
  • Para idade 10, 15 e 20, a saída deve ser respectivamente Criança, Adolescente, Adulto.

Código inicial

fn classifica_idade(idade: u32) -> &'static str {
    // escreva seu código aqui
}

fn main() {
    for &idade in &[10, 15, 20] {
        println!("{}: {}", idade, classifica_idade(idade));
    }
}

Saída esperada

10: Criança
15: Adolescente
20: Adulto
Ver dica

O bloco if pode ser a última expressão da função. Não use return dentro dos blocos.

Mostrar solução
fn classifica_idade(idade: u32) -> &'static str {
    if idade < 12 {
        "Criança"
    } else if idade < 18 {
        "Adolescente"
    } else {
        "Adulto"
    }  // bloco if é a expressão de retorno
}

fn main() {
    for &idade in &[10, 15, 20] {
        println!("{}: {}", idade, classifica_idade(idade));
    }
}

Passo a passo

  1. A função recebe idade: u32 e promete retornar &'static str.
  2. Usamos if idade < 12 para testar a primeira condição.
  3. Se verdadeiro, a expressão "Criança" é o valor do bloco if.
  4. Caso contrário, else if idade < 18 testa a segunda condição; se verdadeira, retorna "Adolescente".
  5. O else final cobre os demais casos e retorna "Adulto".
  6. Todo o bloco if é a última expressão da função, então seu valor é retornado implicitamente.
  7. Em main, iteramos sobre um array de idades e imprimimos o resultado.

Por que funciona

O bloco if em Rust é uma expressão que avalia para um valor. Como cada ramo termina com uma string literal sem ponto e vírgula, o valor do ramo escolhido se torna o valor do bloco if e, por consequência, o retorno da função. Isso evita a necessidade de return em cada ramo.

Erros comuns

  • Colocar ; após as strings dentro dos blocos: cada ramo retornaria (), e o compilador reclamaria de tipos incompatíveis.
  • Esquecer o else final: o compilador não saberia o valor para idades >= 18, causando erro de tipo.
  • Usar return dentro dos blocos e também no final: funciona, mas não é idiomático e foge do exercício.

Outra forma de resolver

Usar match com guardas:

fn classifica_idade(idade: u32) -> &'static str {
    match idade {
        0..=11 => "Criança",
        12..=17 => "Adolescente",
        _ => "Adulto",
    }
}

match é preferível quando há muitas faixas ou padrões complexos.

Saída esperada

10: Criança
15: Adolescente
20: Adulto