Usando 'match' com 'Result'
Parte da seção Logic & Flow 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 imprimir a mensagem apropriada.
Requisitos:
- Ler a primeira entrada (dividendo) e remover espaços em branco
- Converter a primeira entrada para
f64 - Ler a segunda entrada (divisor) e remover espaços em branco
- Converter a segunda entrada para
f64 - Criar uma função que receba 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
- Chamar a função com os dois números convertidos
- Usar uma expressão
matchpara lidar com oResult - No braço
Ok(value), imprima:Result: [value] - No braço
Err(error), imprima:Error: [error]
Entrada:
- Primeira linha: Um número representando o dividendo (ex:
10.0) - Segunda linha: Um número representando o divisor (ex:
2.0)
Saída:
- Se a divisão for bem-sucedida:
Result: [result] - Se houver divisão por zero:
Error: Division by zero
Folha de consulta
Use match para lidar com ambas as variantes Ok e Err de um Result:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}A expressão match obriga você a lidar com os casos de sucesso e falha. Quando o Result é Ok, ela extrai o valor de sucesso e executa o primeiro braço. Quando é Err, ela extrai a informação de erro e executa o segundo braço.
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 Logic & Flow
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 Final