Menu
Coddy logo textTech

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: 0

Esta abordagem é muito mais segura do que .unwrap() porque seu programa nunca irá travar - você sempre recebe um valor utilizável de volta.

challenge icon

Desafio

Fácil

Você 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, atribua Some(score)
    • Se o status de disponibilidade for no, atribua None
  • Use .unwrap_or(50) para extrair a pontuação com um valor padrão de 50
  • 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 yes ou no

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 0

Este 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);
}
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