A melhor maneira de descrever o que estou procurando é mostrar o código com falha que tentei até agora:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
Eu tenho cerca de 4 ou 5 when
situações diferentes que devem ser acionadas por aproximadamente 50 diferentes valores possíveis de car
. Existe uma maneira de fazer isso com case
blocos ou devo tentar um if
bloco maciço ?
ruby-on-rails
ruby
syntax
switch-statement
usuario
fonte
fonte
when "toyota", "lexus"
, eu recebo:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. No entanto, quando escrevo istowhen "toyota","lexus"
:, funciona. A única diferença é um espaço após vírgula.or
ou||
aqui porquewhen
leva uma série de expressões separadas por vírgula à direita, e não um único identificador. Por esse motivo, se você tiverwhen a or b
, não está claro se isso deve ser tomado como o equivalente dewhen a, b
ouwhen (a or b)
, o último dos quais avalia a expressãoa or b
primeiro antes de jogá-la no quando. É mais surpreendente e menos fácil lidar com o idioma para ter tokens que mudam de comportamento com base no contexto e, portanto, você não seria capaz de usar umaor
expressão real no lado direito de um quando.Você pode tirar proveito da sintaxe "splat" ou achatada do ruby.
Isso faz com que as
when
cláusulas exageradas - você tem cerca de 10 valores para testar por filial, se bem entendi - um pouco mais legíveis na minha opinião. Além disso, você pode modificar os valores para testar em tempo de execução. Por exemplo:Outra abordagem comum seria usar um hash como uma tabela de despacho, com chaves para cada valor de
car
e valores que são algum objeto que pode ser chamado, encapsulando o código que você deseja executar.fonte
when
filas. Obrigado por compartilhar.Outra boa maneira de colocar sua lógica nos dados é algo como isto:
fonte