Menu
Coddy logo textTech

O Enum Option Revisitado

Parte da seção Programação Orientada a Objetos do Journey de Rust da Coddy. Lição 17 de 61.

Você já encontrou Option<T> em Rust: é o enum padrão para representar valores que podem ou não existir. Agora vamos analisá-lo sob a perspectiva da OOP: Option não é apenas um enum, é um tipo com métodos integrados poderosos que permitem lidar com valores nulos de forma segura e elegante.

Em vez de fazer correspondências todas as vezes, você pode usar métodos diretamente em valores de Option. O método unwrap_or retorna o valor interno se ele existir ou um valor padrão que você fornecer:

let maybe_name: Option<String> = Some(String::from("Alice"));
let name = maybe_name.unwrap_or(String::from("Guest"));
println!("{}", name);  // Alice

let empty: Option<String> = None;
let fallback = empty.unwrap_or(String::from("Guest"));
println!("{}", fallback);  // Guest

O método map transforma o valor interno se ele existir, mantendo None inalterado. Isso permite encadear operações sem verificar constantemente se há None:

let maybe_num: Option<i32> = Some(5);
let doubled = maybe_num.map(|x| x * 2);
println!("{:?}", doubled);  // Some(10)

let nothing: Option<i32> = None;
let still_nothing = nothing.map(|x| x * 2);
println!("{:?}", still_nothing);  // None

Esses métodos incorporam os princípios de OOP: o tipo Option encapsula o conceito de "talvez um valor" e fornece uma interface clara para trabalhar com ele. Você chama métodos no objeto em vez de escrever lógica externa para inspecioná-lo.

challenge icon

Desafio

Fácil

Vamos criar um sistema de perfil de usuário que lida adequadamente com dados opcionais usando métodos de Option. Os usuários podem ter um apelido definido ou podem não ter. Seu sistema lidará elegantemente com ambos os casos, sem correspondência explícita.

Você criará dois arquivos para organizar seu código:

  • profile.rs: Defina uma struct pública Profile com dois campos: username (String) e nickname (Option<String>). Implemente:
    • Um construtor new que recebe um nome de usuário e um apelido opcional
    • Um método display_name que retorna o apelido se ele existir, ou o nome de usuário como alternativa: use unwrap_or para lidar com isso
    • Um método formatted_nickname que retorna um Option<String> com o apelido entre colchetes (como "[CoolNick]") se ele existir, ou None se não houver apelido: use map para transformar o valor
  • main.rs: Inclua seu módulo de perfil e crie dois perfis: um com apelido e outro sem. Demonstre ambos os métodos em cada perfil para mostrar como os métodos de Option lidam de maneira diferente com valores presentes e ausentes.

Para o método formatted_nickname, use a formatação de depuração ({:?}) ao imprimir, pois ele retorna um Option.

Sua saída deve seguir exatamente este formato, mostrando ambos os perfis:

Display name: {name}
Formatted nickname: {option}
Display name: {name}
Formatted nickname: {option}

Por exemplo, com um perfil para o nome de usuário "alice" com o apelido "Ace" e outro para o nome de usuário "bob" sem apelido, a saída seria:

Display name: Ace
Formatted nickname: Some("[Ace]")
Display name: bob
Formatted nickname: None

Você receberá três entradas: o primeiro nome de usuário, o apelido do primeiro usuário e o segundo nome de usuário (que não tem apelido).

Experimente você mesmo

mod profile;

use profile::Profile;

fn main() {
    // Ler entradas
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let username1 = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let nickname1 = input2.trim().to_string();

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let username2 = input3.trim().to_string();

    // TODO: Criar o primeiro perfil com username1 e nickname1 (Some)
    
    // TODO: Create second profile with username2 and no nickname (None)
    
    // TODO: Print display_name and formatted_nickname for first profile
    // Use {:?} for formatted_nickname since it returns an Option
    
    // TODO: Print display_name and formatted_nickname for second profile
}
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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Rust online