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().
Desafio
FácilVocê 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
i32usando.parse::<i32>() - Crie uma variável
Option<i32>:- Se a segunda entrada for
valid, atribuaSome(parsed_number) - Se a segunda entrada for
invalid, atribuaNone
- Se a segunda entrada for
- Use
.unwrap()para extrair o valor doOption - Imprima o valor extraído no formato:
Value: [number]
Entrada:
- Primeira linha: Um número como uma string (ex:
42) - Segunda linha: Ou
validouinvalid
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: 42Aviso: 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]
}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