Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Você 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, atribua Some(product_name.to_string())
    • Se o status do estoque for no, atribua None
  • 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: yes ou no

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]
    
}
quiz iconTeste seus conhecimentos

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