Médio Rust
Transformando e encadeando
Enunciado
Complete a função processar que recebe um Option<i32>, multiplica por 2 usando map e, se o resultado for maior que 10, soma 1 usando and_then. Retorne None se a condição não for satisfeita.
Requisitos
- Use
mappara dobrar o valor. - Use
and_thenpara verificar se é maior que 10 e somar 1. - Imprima o resultado para
Some(6)eSome(3).
Código inicial
fn processar(op: Option<i32>) -> Option<i32> {
// complete aqui
}
fn main() {
println!("{:?}", processar(Some(6)));
println!("{:?}", processar(Some(3)));
}
Saída esperada
Some(13)
None
Ver dica
map transforma o valor dentro de Some. and_then é usado quando a função de transformação também retorna Option.
Mostrar solução
fn processar(op: Option<i32>) -> Option<i32> {
op.map(|x| x * 2) // dobra o valor
.and_then(|x| if x > 10 { Some(x + 1) } else { None }) // soma 1 se > 10
}
fn main() {
println!("{:?}", processar(Some(6))); // Some(13)
println!("{:?}", processar(Some(3))); // None
}
Passo a passo
op.map(|x| x * 2)transformaSome(6)emSome(12)eSome(3)emSome(6). SeopfosseNone, continuariaNone..and_then(|x| ...)recebe oOptionresultante e aplica uma função que retornaOption.- Dentro do
and_then, verificamos sex > 10. Se sim, retornamosSome(x + 1); senão,None. - Para
Some(12), retornaSome(13). ParaSome(6), retornaNone. - O
mainimprime os resultados com{:?}para mostrarOption.
Por que funciona
map aplica uma função ao valor dentro de Some e propaga None automaticamente. and_then é usado quando a função também retorna Option, evitando aninhamento Option<Option<T>>. A combinação permite encadear transformações e validações de forma fluida.
Erros comuns
- Usar
mapem vez deand_thendentro da segunda etapa:op.map(|x| x * 2).map(|x| if x > 10 { Some(x + 1) } else { None })resultaria emOption<Option<i32>>, nãoOption<i32>. - Esquecer de retornar
Nonenoelse:if x > 10 { Some(x + 1) }semelsenão compila, pois o tipo esperado éOption<i32>.
Outra forma de resolver
Usar filter e map:
op.map(|x| x * 2).filter(|&x| x > 10).map(|x| x + 1)
Prefira and_then quando a lógica de validação for mais complexa.
Saída esperada
Some(13)
None