Case com Classes e Regex
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 38 de 56.
Você usou case com intervalos. A mesma instrução também faz a correspondência com classes e expressões regulares: ambos por meio do operador === que o when chama nos bastidores.
Faça a correspondência por classe para ramificar com base no tipo de valor que você recebeu:
def describe(value)
case value
when Integer then "a whole number"
when Float then "a decimal"
when String then "some text"
else "something else"
end
end
puts describe(42) # a whole number
puts describe(3.14) # a decimal
puts describe("hi") # some textFaça a correspondência com uma regex para ramificar com base no formato de uma string, um número de telefone, um e-mail, uma data:
def kind_of(text)
case text
when /^\d+$/ then "all digits"
when /@/ then "looks like an email"
when /^[A-Z]/ then "starts with a capital"
else "other"
end
endIsso é muito mais limpo do que uma cadeia de chamadas is_a? ou match? em if/elsif.
Desafio
FácilLeia uma única linha de entrada. Use uma instrução case para imprimir um desses rótulos com base na aparência da entrada:
- Todos os dígitos,
number - Contém
@:email - Começa com uma letra maiúscula,
name - Qualquer outra coisa,
unknown
Verifique as regras na ordem listada (então 123 é number, não unknown; kevin@coddy.tech é email; Alice é name).
Para a entrada kevin@coddy.tech, a saída é email.
Folha de consulta
O case/when do Ruby faz a correspondência com classes e expressões regulares usando === por baixo dos panos.
Correspondência por classe:
case value
when Integer then "a whole number"
when Float then "a decimal"
when String then "some text"
else "something else"
endCorrespondência por regex:
case text
when /^\d+$/ then "all digits"
when /@/ then "looks like an email"
when /^[A-Z]/ then "starts with a capital"
else "other"
endExperimente você mesmo
input = gets.chomp
# TODO: case input ... quando /^\d+$/, /@/, /^[A-Z]/ ... senão ... fim
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 e Fluxo
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline8Tomada de Decisão Avançada
Case com Classes e Regexwhen com múltiplos valoresOperador Ternárioif / unless inlineRecapitulação - Classificador de Notas