Usando 'match' com 'Result'
Parte da seção Lógica & Fluxo do Journey de Rust da Coddy. Lição 43 de 66.
Agora que você entende o que é um Result, vamos aprender a maneira mais explícita e poderosa de lidar com casos de sucesso e falha: usando uma expressão match.
Assim como com Option, match força você a lidar com ambas as variantes de um Result. Você cria um braço para Ok para lidar com o sucesso, e outro braço para Err para lidar com a falha:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}Quando o Result é Ok, o match extrai o valor de sucesso e executa o primeiro braço. Quando é Err, ele extrai a informação de erro e executa o segundo braço. Este padrão garante que você nunca ignore acidentalmente um erro potencial.
Desafio
FácilVocê receberá duas entradas. A primeira entrada é um número (como uma string), e a segunda entrada é outro número (como uma string). Crie uma função que tente dividir o primeiro número pelo segundo número e retorne um Result<f64, &'static str>. Se o segundo número for zero, retorne um Err com a mensagem "Division by zero". Caso contrário, retorne Ok com o resultado da divisão. Use uma expressão match para lidar com os casos Ok e Err e imprima a mensagem apropriada.
Requisitos:
- Leia a primeira entrada (dividendo) e remova os espaços em branco
- Converta a primeira entrada para
f64 - Leia a segunda entrada (divisor) e remova os espaços em branco
- Converta a segunda entrada para
f64 - Crie uma função que aceite dois parâmetros
f64e retorneResult<f64, &'static str> - Dentro da função, verifique se o divisor é
0.0:- Se sim, retorne
Err("Division by zero") - Se não, retorne
Ok(dividend / divisor)
- Se sim, retorne
- Chame a função com os dois números convertidos
- Use uma expressão
matchpara lidar com oResult - No ramo
Ok(value), imprima:Result: [value] - No ramo
Err(error), imprima:Error: [error]
Entrada:
- Primeira linha: um número que representa o dividendo (por exemplo,
10.0) - Segunda linha: um número que representa o divisor (por exemplo,
2.0)
Saída:
- Se a divisão for bem-sucedida:
Result: [result] - Se houver divisão por zero:
Error: Division by zero
Experimente você mesmo
use std::io;
// TODO: Crie sua função divide aqui que retorna Result<f64, &'static str>
fn main() {
// Lê a primeira entrada (dividendo)
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// Lê a segunda entrada (divisor)
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: Chame sua função divide e use match para tratar o Result
// Imprima "Result: [value]" para o caso Ok
// Imprima "Error: [error]" para o caso Err
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book7Tratando Erros com 'Result'
O que é um 'Result'?Usando 'match' com 'Result'is_ok() e is_err()Atalhos: unwrap e expectO Operador de Interrogação '?'Parsing de Strings para NúmerosRecapitulação - Função de Divisão Segura2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo FinalPratique por conta própria: Compilador de Rust online