Usando 'match' com 'Option'
Parte da seção Logic & Flow 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á o nome de um estudante como entrada. O nome pode estar presente no sistema ou pode estar ausente. Crie um 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 quaisquer espaços em branco da entrada usando
.trim() - Crie uma variável
Option<String>:- Se o nome após o trim não estiver vazio, atribua
Some(name.to_string()) - Se o nome após o trim estiver vazio, atribua
None
- Se o nome após o trim não estiver vazio, atribua
- Use uma expressão
matchpara lidar com ambas as variantes doOption - No braço
Some(name), imprima:Welcome, [name]! - No braço
None, imprima:No name provided
Entrada:
- Uma única linha contendo o nome de um estudante ou uma linha vazia
Saída:
- Se um nome for fornecido:
Welcome, [name]! - Se nenhum nome for fornecido (entrada vazia):
No name provided
Folha de consulta
Use uma expressão match para lidar com valores Option criando 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!"),
}O braço Some(name) usa desestruturação para extrair o valor interno da variante Some. A variável name contém o valor real, não o invólucro Option.
O braço None lida com o caso onde não há valor, permitindo que você forneça um comportamento alternativo.
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 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