Fornecendo um valor padrão: unwrap_or
Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 40 de 66.
Embora .unwrap() e .expect() possam extrair valores de um Option, ambos possuem uma falha grave: eles entram em pânico ao encontrar um None. Para um código mais seguro, o Rust fornece o .unwrap_or() - um método que nunca entra em pânico.
O método .unwrap_or() recebe um valor padrão como argumento. Se o Option contém um Some, ele retorna o valor interno. Se for um None, ele retorna o valor padrão que você forneceu:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // Imprime: Score: 85
let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // Imprime: Score: 0Esta abordagem é muito mais segura do que .unwrap() porque seu programa nunca irá travar - você sempre recebe um valor utilizável de volta.
Desafio
FácilVocê receberá duas entradas. A primeira entrada é uma pontuação (como um número), e a segunda entrada indica se a pontuação está disponível (yes) ou ausente (no). Crie um Option<i32> baseado no status de disponibilidade. Use .unwrap_or() para extrair a pontuação com segurança com um valor padrão de 50, e então imprima a pontuação final.
Requisitos:
- Leia a primeira entrada (score) e remova os espaços em branco
- Converta a primeira entrada para
i32 - Leia a segunda entrada (status de disponibilidade) e remova os espaços em branco
- Crie uma variável
Option<i32>:- Se o status de disponibilidade for
yes, atribuaSome(score) - Se o status de disponibilidade for
no, atribuaNone
- Se o status de disponibilidade for
- Use
.unwrap_or(50)para extrair a pontuação com um valor padrão de50 - Imprima a pontuação final no formato:
Final score: [score]
Entrada:
- Primeira linha: Um número representando a pontuação (ex:
85) - Segunda linha: Ou
yesouno
Saída:
- Se o status de disponibilidade for
yes:Final score: [score](a pontuação real) - Se o status de disponibilidade for
no:Final score: 50(o valor padrão)
Folha de consulta
O método .unwrap_or() fornece uma maneira segura de extrair valores de um Option sem causar pânico (panic). Ele recebe um valor padrão como argumento e retorna o valor interno se for Some, ou o valor padrão se for None:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score is 85
let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score is 0Este método é mais seguro do que .unwrap() ou .expect() porque ele nunca causa um pânico - você sempre recebe um valor utilizável.
Experimente você mesmo
use std::io;
fn main() {
// Ler a pontuação
let mut score_input = String::new();
io::stdin().read_line(&mut score_input).expect("Failed to read line");
let score: i32 = score_input.trim().parse().expect("Invalid number");
// Ler o status de disponibilidade
let mut availability = String::new();
io::stdin().read_line(&mut availability).expect("Failed to read line");
let availability = availability.trim();
// TODO: Escreva seu código abaixo
// Criar um Option<i32> baseado no status de disponibilidade
// Usar .unwrap_or(50) para obter a pontuação final
// Imprimir o resultado
println!("Final score: {}", final_score);
}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