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_idadee receberu32. - Deve retornar
&'static str. - Deve usar um bloco
if/else if/elsecomo 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
- A função recebe
idade: u32e promete retornar&'static str. - Usamos
if idade < 12para testar a primeira condição. - Se verdadeiro, a expressão
"Criança"é o valor do blocoif. - Caso contrário,
else if idade < 18testa a segunda condição; se verdadeira, retorna"Adolescente". - O
elsefinal cobre os demais casos e retorna"Adulto". - Todo o bloco
ifé a última expressão da função, então seu valor é retornado implicitamente. - 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
elsefinal: o compilador não saberia o valor para idades >= 18, causando erro de tipo. - Usar
returndentro 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