Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Você 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, atribua Ok(parsed_number)
    • Se o status for error, atribua Err("Invalid operation")
  • Use .expect("Failed to get value") para extrair o valor do Result
  • Imprima o valor extraído no formato: Value: [value]

Entrada:

  • Primeira linha: Um número (ex: 75)
  • Segunda linha: Ou ok ou error

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 personalizada

Esses 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]
    
}
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