O método expect
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 39 de 66.
Embora o .unwrap() resolva o problema, ele tem uma grande desvantagem: quando ocorre um panic em um None, a mensagem de erro é genérica e pouco útil. É aqui que o .expect() vem ao resgate.
O método .expect() funciona exatamente como o .unwrap() - ele extrai o valor de um Some e causa um panic em um None. A principal diferença é que o .expect() permite que você forneça uma mensagem de panic personalizada:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Se o Option contiver um Some, o .expect() retorna o valor interno exatamente como o .unwrap(). Mas se for um None, em vez de uma mensagem de pânico genérica, você verá sua mensagem personalizada, tornando muito mais fácil entender o que deu errado e onde.
Desafio
FácilVocê receberá duas entradas. A primeira entrada é o nome de um produto, e a segunda entrada indica se o produto está em estoque (yes) ou fora de estoque (no). Crie um Option<String> que contenha Some(product_name) se o produto estiver em estoque, ou None se estiver fora de estoque. Use .expect() com uma mensagem descritiva para extrair o nome do produto e imprimi-lo.
Requisitos:
- Leia a primeira entrada (nome do produto) e remova os espaços em branco (trim)
- Leia a segunda entrada (status do estoque) e remova os espaços em branco (trim)
- Crie uma variável
Option<String>:- Se o status do estoque for
yes, atribuaSome(product_name.to_string()) - Se o status do estoque for
no, atribuaNone
- Se o status do estoque for
- Use
.expect()com a mensagem"Product should be in stock"para extrair o nome do produto - Imprima o nome do produto extraído no formato:
Product available: [product_name]
Entrada:
- Primeira linha: Um nome de produto (ex:
Laptop) - Segunda linha:
yesouno
Saída:
- Se o status do estoque for
yes:Product available: [product_name] - Se o status do estoque for
no: O programa entrará em pânico (panic) com a mensagem personalizada "Product should be in stock" (este é o comportamento esperado para este desafio)
Nota: Quando o status do estoque for no, chamar .expect() em um None causará um pânico com sua mensagem personalizada. Isso demonstra como o .expect() fornece informações de erro mais úteis em comparação ao .unwrap().
Folha de consulta
O método .expect() funciona como o .unwrap(), mas permite que você forneça uma mensagem de pânico personalizada para uma melhor depuração de erros.
Quando chamado em um Option:
- Se ele contiver
Some, ele retorna o valor interno - Se ele contiver
None, ele entra em pânico com sua mensagem personalizada
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);A mensagem de erro personalizada torna mais fácil identificar o que deu errado e onde no seu código.
Experimente você mesmo
use std::io;
fn main() {
// Ler o nome do produto
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// Ler o status do estoque
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: Escreva seu código abaixo
// Criar um Option<String> baseado no stock_status
// Usar .expect() para extrair o nome do produto
// Imprimir o resultado no formato: Product available: [product_name]
}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 Book2Introduçã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 Final6Lidando com a Ausência com 'Option'
O que é um 'Option'?Usando 'match' com 'Option'is_some() e is_none()Fazendo o unwrap de um 'Option'O método expectFornecendo um valor padrão: unwrap_orRecapitulação - Encontrar um Elemento