O método expect
Parte da seção Lógica & Fluxo 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 é um nome de 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
- Leia a segunda entrada (status do estoque) e remova os espaços em branco
- 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 (por exemplo,
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 com a mensagem personalizada "Product should be in stock" (esse é o comportamento esperado para este desafio)
Observação: Quando o status do estoque for no, chamar .expect() em None causará um pânico com sua mensagem personalizada. Isso demonstra como .expect() fornece informações de erro mais úteis em comparação com .unwrap().
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 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 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 ElementoPratique por conta própria: Compilador de Rust online