Switch
A instrução switch é uma forma abreviada de escrever uma série de instruções if que verificam o mesmo valor. Observe que o valor é avaliado apenas uma vez. Como as instruções if, os switches podem ter um bloco else para tratar ausência de correspondências. A comparação é feita com o operador ==. Na instrução switch, você também pode usar expressão de atribuição para armazenar valor de variável temporária.
switch name := "Dan" when "Robert" print "Você é Robert" when "Dan", "Daniel" print "Seu nome é Dan" else print "Não sei quem você é com o nome #{name}"switch name := "Dan" when "Robert" print "Você é Robert" when "Dan", "Daniel" print "Seu nome é Dan" else print "Não sei quem você é com o nome #{name}"Uma cláusula when de um switch pode corresponder a múltiplos valores listando-os separados por vírgula.
Os switches também podem ser usados como expressões; aqui podemos atribuir o resultado do switch a uma variável:
b = 1next_number = switch b when 1 2 when 2 3 else error "não consigo contar tão alto!"b = 1next_number = switch b when 1 2 when 2 3 else error "não consigo contar tão alto!"Podemos usar a palavra-chave then para escrever o bloco when de um switch em uma única linha. Nenhuma palavra-chave extra é necessária para escrever o bloco else em uma única linha.
msg = switch math.random(1, 5) when 1 then "você tem sorte" when 2 then "você quase tem sorte" else "não tão sortudo"msg = switch math.random(1, 5) when 1 then "você tem sorte" when 2 then "você quase tem sorte" else "não tão sortudo"Se você quiser escrever código com uma indentação a menos ao escrever uma instrução switch, pode colocar a primeira cláusula when na linha de início da instrução, e então todas as outras cláusulas podem ser escritas com uma indentação a menos.
switch math.random(1, 5) when 1 print "você tem sorte" -- duas indentações else print "não tão sortudo"
switch math.random(1, 5) when 1 print "você tem sorte" -- uma indentaçãoelse print "não tão sortudo"switch math.random(1, 5) when 1 print "você tem sorte" -- duas indentações else print "não tão sortudo"
switch math.random(1, 5) when 1 print "você tem sorte" -- uma indentaçãoelse print "não tão sortudo"Vale notar a ordem da expressão de comparação do case. A expressão do case está no lado esquerdo. Isso pode ser útil se a expressão do case quiser sobrescrever como a comparação é feita definindo um metamétodo eq.
Correspondência de tabela
Seção intitulada “Correspondência de tabela”Você pode fazer correspondência de tabela em uma cláusula when de switch, se a tabela puder ser desestruturada por uma estrutura específica e obter valores não-nil.
items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "tamanho #{width}, #{height}"items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "tamanho #{width}, #{height}"Você pode usar valores padrão para opcionalmente desestruturar a tabela para alguns campos.
item = {}
{pos: {:x = 50, :y = 200}} = item -- obtém erro: attempt to index a nil value (field 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passaráitem = {}
{pos: {:x = 50, :y = 200}} = item -- obtém erro: attempt to index a nil value (field 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passaráVocê também pode corresponder contra elementos de array, campos de tabela, e até estruturas aninhadas com literais de array ou tabela.
Corresponder contra elementos de array.
switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b tem valor padrão print "1, 2, #{b}"switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b tem valor padrão print "1, 2, #{b}"Corresponder contra campos de tabela com desestruturação.
switch tb when success: true, :result print "sucesso", result when success: false print "falhou", result else print "inválido"switch tb when success: true, :result print "sucesso", result when success: false print "falhou", result else print "inválido"Corresponder contra estruturas de tabela aninhadas.
switch tb when data: {type: "success", :content} print "sucesso", content when data: {type: "error", :content} print "erro", content else print "inválido"switch tb when data: {type: "success", :content} print "sucesso", content when data: {type: "error", :content} print "erro", content else print "inválido"Corresponder contra array de tabelas.
switch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "correspondido", fourthswitch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "correspondido", fourthCorresponder contra uma lista e capturar um intervalo de elementos.
segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Grupo:", groups -- imprime: {"admin", "users"} print "Recurso:", resource -- imprime: "logs" print "Ação:", action -- imprime: "view"segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Grupo:", groups -- imprime: {"admin", "users"} print "Recurso:", resource -- imprime: "logs" print "Ação:", action -- imprime: "view"