Atalhos: unwrap e expect
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 45 de 66.
Você já aprendeu sobre .unwrap() e .expect() com Option, e esses mesmos métodos funcionam com Result também. No entanto, o comportamento deles é ligeiramente diferente ao lidar com casos de sucesso e falha.
O método .unwrap() extrai o valor de uma variante Ok, mas se o Result for um Err, seu programa entrará em pânico e falhará. Da mesma forma, o .expect() faz a mesma coisa, mas permite que você forneça uma mensagem de pânico personalizada que facilita a depuração:
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Imprime: Value: 42
// Isso causaria pânico com a mensagem personalizada:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Entra em pânico!Embora esses métodos forneçam acesso rápido a valores bem-sucedidos, eles devem ser usados com cuidado. Eles são mais apropriados quando você tem certeza absoluta de que a operação será bem-sucedida, ou durante o desenvolvimento e testes.
Desafio
FácilVocê receberá duas entradas. A primeira entrada é um número (como uma string), e a segunda entrada é um indicador de status (ok ou error). Crie um Result<i32, &'static str> baseado no status. Se o status for ok, crie um Ok contendo o número analisado. Se o status for error, crie um Err com a mensagem "Invalid operation". Use .expect() com uma mensagem personalizada para extrair o valor do Result e imprimi-lo.
Requisitos:
- Leia a primeira entrada (número) e remova os espaços em branco
- Converta a primeira entrada para
i32 - Leia a segunda entrada (status) e remova os espaços em branco
- Crie uma variável
Result<i32, &'static str>:- Se o status for
ok, atribuaOk(parsed_number) - Se o status for
error, atribuaErr("Invalid operation")
- Se o status for
- Use
.expect("Failed to get value")para extrair o valor doResult - Imprima o valor extraído no formato:
Value: [value]
Entrada:
- Primeira linha: Um número (ex:
75) - Segunda linha: Ou
okouerror
Saída:
- Se o status for
ok:Value: [number] - Se o status for
error: O programa entrará em pânico com a mensagem personalizada (não testado neste desafio)
Nota: Para este desafio, os casos de teste usarão apenas o status ok para garantir a execução bem-sucedida. O caso error causaria um pânico, que é o comportamento esperado de .expect() ao encontrar um Err.
Folha de consulta
Os métodos .unwrap() e .expect() funcionam com tipos Result para extrair valores da variante Ok.
.unwrap() extrai o valor de um Ok, mas entra em pânico (panics) se o Result for um Err:
let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // Imprime: Value: 42.expect() funciona da mesma forma, mas permite que você forneça uma mensagem de pânico personalizada para facilitar a depuração:
let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Imprime: Value: 42
// Isso causaria pânico com a mensagem personalizada:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // Entra em pânico com a mensagem personalizadaEsses métodos devem ser usados com cuidado, pois farão seu programa travar se o Result for um Err. Eles são mais apropriados quando você tem certeza de que a operação terá sucesso ou durante o desenvolvimento e testes.
Experimente você mesmo
use std::io;
fn main() {
// Lê a primeira entrada (número)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// Converte o número para i32
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// Lê a segunda entrada (status)
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: Escreva seu código abaixo
// Crie um Result<i32, &'static str> baseado no status
// Use .expect() para extrair o valor
// Imprima o resultado no formato: Value: [value]
}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