Menu
Coddy logo textTech

Fazendo o unwrap de um 'Option'

Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 38 de 66.

Às vezes você precisa extrair o valor real de um Option quando você tem certeza de que ele contém um Some. O Rust fornece o método .unwrap() para esse propósito - ele retira o valor de um Some e o entrega diretamente a você.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

Quando você chama .unwrap() em um Some(value), ele retorna o valor interno. No exemplo acima, actual_number torna-se 42 - não mais envolvido em um Option.

No entanto, há um aviso crítico: se você chamar .unwrap() em um None, seu programa entrará em pânico e travará imediatamente. Isso torna o .unwrap() um método potencialmente perigoso que só deve ser usado quando você tiver certeza absoluta de que o Option contém um Some.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Isso causará um pânico!

Use .unwrap() com moderação e apenas em situações onde você possa garantir que o Option contém um valor, como em exemplos simples ou quando você já tiver verificado com .is_some().

challenge icon

Desafio

Fácil

Você receberá duas entradas. A primeira entrada é um número (como uma string), e a segunda entrada indica se este número deve ser tratado como válido ou inválido. Se a segunda entrada for valid, crie um Option<i32> contendo Some com o número analisado. Se a segunda entrada for invalid, crie um Option<i32> contendo None. Use .unwrap() para extrair o valor do Option e imprimi-lo.

Requisitos:

  • Leia a primeira entrada e remova os espaços em branco
  • Leia a segunda entrada e remova os espaços em branco
  • Analise a primeira entrada para i32 usando .parse::<i32>()
  • Crie uma variável Option<i32>:
    • Se a segunda entrada for valid, atribua Some(parsed_number)
    • Se a segunda entrada for invalid, atribua None
  • Use .unwrap() para extrair o valor do Option
  • Imprima o valor extraído no formato: Value: [number]

Entrada:

  • Primeira linha: Um número como uma string (ex: 42)
  • Segunda linha: Ou valid ou invalid

Saída:

  • Se a segunda entrada for valid: Value: [number]
  • Se a segunda entrada for invalid: O programa entrará em pânico (este é o comportamento esperado para este desafio)

Nota: Quando a segunda entrada for invalid, chamar .unwrap() em um None causará um pânico. Isso demonstra a natureza perigosa do .unwrap() quando você não tem certeza de que o Option contém um valor.

Folha de consulta

O método .unwrap() extrai o valor de um Option<T>:

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // Imprime: The number is: 42

Aviso: Chamar .unwrap() em None fará com que seu programa entre em pânico (panic) e encerre inesperadamente:

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // Isso causará um panic!

Use apenas .unwrap() quando você tiver certeza absoluta de que o Option contém um valor Some.

Experimente você mesmo

use std::io;

fn main() {
    // Lê a primeira entrada (número como string)
    let mut number_input = String::new();
    io::stdin().read_line(&mut number_input).expect("Failed to read line");
    let number_input = number_input.trim();
    
    // Lê a segunda entrada (valid ou invalid)
    let mut validity_input = String::new();
    io::stdin().read_line(&mut validity_input).expect("Failed to read line");
    let validity_input = validity_input.trim();
    
    // Analisa o número
    let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
    
    // TODO: Escreva seu código abaixo
    // Crie um Option<i32> baseado no validity_input
    // Se validity_input for "valid", atribua Some(parsed_number)
    // Se validity_input for "invalid", atribua None
    // Então use .unwrap() para extrair o valor e imprimi-lo no formato: Value: [number]
    
}
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