The Many Uses Of Ruby Case Statements

Quando precisar de utilizar algumas if / elsif declarações, poderá considerar a utilização de uma declaração de caso Ruby. Neste post, irá aprender alguns casos de utilização diferentes e como tudo funciona realmente sob o capô.

ruby case

Nota: Em outras linguagens de programação, isto é conhecido como uma declaração de mudança.

Os componentes de uma declaração de caso em Ruby:

>th>Description

Keyword
case Inicia uma definição de declaração de caso. Toma a variável com que vai trabalhar.
when Todas as condições que podem ser correspondidas são uma quando declaração.
else Se nada corresponder, então faz isto. Opcional.

Caso de Ruby & Faixas

A declaração case é mais flexível do que pode parecer à primeira vista. Vejamos um exemplo onde queremos imprimir alguma mensagem dependendo do intervalo em que um valor cai.

case capacitywhen 0 "You ran out of gas."when 1..20 "The tank is almost empty. Quickly, find a gas station!"when 21..70 "You should be ok for now."when 71..100 "The tank is almost full."else "Error: capacity has an invalid value (#{capacity})"end

Acho que este código é bastante elegante comparado com o que a versão if / elsif pareceria.

Caso Ruby & Regex

Também pode usar expressões regulares como a sua when condição. No exemplo seguinte temos um serial_code com uma letra inicial que nos diz como este produto é arriscado de consumir.

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Quando não utilizar o caso Ruby

Quando tiver um simples mapeamento 1:1, poderá ser tentado a fazer algo como isto.

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

Na minha opinião seria melhor fazer isto em vez disso:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

A solução de hash é mais eficiente e mais fácil de trabalhar. Não acha?

Como funciona o caso: o ==== método

Pode estar a perguntar-se como case funciona debaixo do capô. Se voltarmos ao nosso primeiro exemplo, é isto que está a acontecer:

(1..20) === capacity(21..70) === capacity(71..100) === capacity

Como se pode ver, a condição é invertida porque Ruby chama === no objecto à esquerda. O === é apenas um método que pode ser implementado por qualquer classe. Neste caso, Range implementa este método retornando verdadeiro apenas se o valor for encontrado dentro da gama.

É assim que === é implementado em Rubinius (para a classe Range):

def ===(value) include?(value)end

Source: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

Outra classe interessante que implementa === é a Proc class.

p> post relacionado: Aprenda mais sobre procs & lambdas.

Neste exemplo defino dois procs, um para verificar um even número, e outro para odd.

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

Isto é o que está realmente a acontecer:

odd.===(number)even.===(number)

Usa-se === num proc tem o mesmo efeito que usar call.

Conclusão

Aprendeu como funciona a declaração do caso Ruby e como pode ser flexível. Agora é a sua vez de começar a utilizá-la da melhor forma nos seus próprios projectos.

Espero que tenha achado este artigo útil!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *