Usando 'match' com 'Option'
Parte da seção Lógica & Fluxo do Journey de Rust da Coddy. Lição 36 de 66.
Agora que você entende o que o Option é, vamos aprender a maneira mais comum e explícita de lidar com ele: usando uma expressão match. Essa abordagem força você a considerar ambos os casos possíveis - quando há um valor e quando não há.
A expressão match funciona perfeitamente com Option porque você pode criar braços para ambas as variantes:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}Observe como o braço Some(name) extrai o valor de dentro da variante Some. A variável name agora contém a String real, não o Option. Isso é chamado de desestruturação - você está extraindo o valor interno de dentro do invólucro.
O braço None trata o caso onde não há valor, permitindo que você forneça um comportamento alternativo, como mostrar uma mensagem padrão ou tomar uma ação completamente diferente.
Desafio
FácilVocê receberá um nome de estudante como entrada. O nome pode estar presente no sistema ou pode estar ausente. Crie uma Option<String> que contenha Some(name) se o nome não estiver vazio, ou None se o nome estiver vazio. Use uma expressão match para lidar com ambos os casos e imprimir a mensagem apropriada.
Requisitos:
- Leia a entrada como uma string (nome do estudante)
- Remova qualquer espaço em branco da entrada usando
.trim() - Crie uma variável
Option<String>:- Se o nome sem espaços não estiver vazio, atribua
Some(name.to_string()) - Se o nome sem espaços estiver vazio, atribua
None
- Se o nome sem espaços não estiver vazio, atribua
- Use uma expressão
matchpara lidar com ambas as variantes deOption - No braço
Some(name), imprima:Welcome, [name]! - No braço
None, imprima:No name provided
Entrada:
- Uma única linha contendo um nome de estudante ou uma linha vazia
Saída:
- Se um nome for fornecido:
Welcome, [name]! - Se nenhum nome for fornecido (entrada vazia):
No name provided
Experimente você mesmo
use std::io;
fn main() {
// Ler entrada
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim();
// TODO: Criar um Option<String> baseado em se o nome está vazio ou não
// TODO: Usar uma expressão match para lidar com os casos Some e None e imprimir a mensagem apropriada
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
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 ElementoPratique por conta própria: Compilador de Rust online