×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Script] Switch-case em Lua?
[Script] Switch-case em Lua?
Jp_darkuss
« Citoyen »
1591055100000
    • Jp_darkuss#4806
    • Profil
    • Derniers messages
#1
  1
Boa noite! Espero que vejam isso à noite. Quem nunca viu o laço condicional switch-case em alguma outra linguagem de programação?

Code de exemplo

1
2
3
4
5
6
7
8
9
10
11
switch(2) {
case 2:
console.log(2);
break;
case 3:
console.log(3);
break;
default:
console.log("Valor inválido");
break;
};

Em alguns casos é melhor usar um Switch-case do que um If-else, por exemplo, como por exemplo se sua condicional for avaliar um só valor. Mas nossa querida Lua não possui esse laço. :(

Então decidi criar um pseudo-switch-case usando funções, caso gostem podem usar :)

Script
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
local switch= {cases= {}}
switch.case= function(caso, callback)
table.insert(switch.cases, {
caso= caso,
callback= callback
})
end
switch.default= function(callback)
switch.cases.default= callback
end
switch.exec= function(caso)
local default= true
for pos= 1, #switch.cases do
if switch.cases[pos].caso== caso then
switch.cases[pos].callback()
default= false
end
end
if type(switch.cases.default)=="function" and default then
switch.cases.default()
end
switch.cases= {}
end


Versão linha-única

Code Lua

1
local switch= {cases= {}} switch.case= function(caso, callback) table.insert(switch.cases, { caso= caso, callback= callback }) end switch.default= function(callback) switch.cases.default= callback end switch.exec= function(caso) local default= true for pos= 1, #switch.cases do if switch.cases[pos].caso== caso then switch.cases[pos].callback() default= false end end if type(switch.cases.default)=="function" and default then switch.cases.default() end switch.cases= {} end


Vamos ver como funciona, vejamos as funções:

  • (Method) switch.case(valor, callback) => void
    "Cria um case em seu switch"

    Parâmetros:

    - valor (any): o valor que será usado para fazer a análise
    - callback (function): a função que será chamada caso sua condicional seja validada


  • (Method) switch.default(callback) => void
    "Cria um default em seu switch"

    Parâmetros:

    - callback (function): a função que será chamada casos seus cases não seja validados


  • (Method) switch.exec(value) => void
    Inicia seu laço switch-case

    Parâmetros:

    - value (any): o valor que será analisado



    Vamos refazer aquele exemplo com as funções:

    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch.case(2, function()
    print(2)
    end)
    switch.case(3, function()
    print(3)
    end)
    switch.default(function()
    print("Valor inválido")
    end)
    switch.exec(2)

    Saiu até com uma linha a menos :)

    Obs: recomendo que dê uma pesquisada na net se não sabe o que é um switch-case, é necessário que saiba como funciona o "original" antes de usar este pseudo.

    Obs 2: se for possível, comentem se seria necessário um switch-case na Linguagem Lua, na minha opinião, sim ;)

  • Dernière modification le 1591182780000
    Gamedroit
    « Citoyen »
    1591057080000
      • Gamedroit#3347
      • Profil
      • Derniers messages
      • Tribu
    #2
      1
    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    local function switch()
    local this = {}
    local _loc = {}

    function this.case(value, callback)
    _loc[value] = callback
    return this
    end

    function this.test(value, ...)
    return _loc[value] and _loc[value](...) or nil, _loc[value] ~= nil -- retorna o valor que a função retornar (em caso de não-retorno pode ser nil, true se o caso existir senão false, ao menos é o que deve retornar com as regras do lua)
    end

    return this
    end

    local option = switch()
    option.case(0, print).case(1, error)

    local userSelect = 0

    option.test(userSelect, "hello world!")

    faz a mesma coisa que o seu ...

    De toda forma, switch-cases em Lua não são realmente necessários, claro que usar um monte de ifs deixa feio mas perde a performance usar várias funções só para testar um valor ... Em python eu também tinha feito um switch case onde vc podia fazer:

    Code Python

    1
    2
    3
    4
    5
    6
    option = switch(input())

    @option.case("0")
    def foo(): print("bar")

    option.case("1", sys.exit, "closed by user")

    O jeito para implementar switch-cases é baixar o código fonte do lua e compilar sua própria versão, foi isso que fiz para corrigir o problema do metamethod __len no lua 5.1

    Dernière modification le 1591057620000
    Jp_darkuss
    « Citoyen »
    1591062540000
      • Jp_darkuss#4806
      • Profil
      • Derniers messages
    #3
      0
    Contistente3 a dit :
    Code Lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    local function switch()
    local this = {}
    local _loc = {}

    function this.case(value, callback)
    _loc[value] = callback
    return this
    end

    function this.test(value, ...)
    return _loc[value] and _loc[value](...) or nil, _loc[value] ~= nil -- retorna o valor que a função retornar (em caso de não-retorno pode ser nil, true se o caso existir senão false, ao menos é o que deve retornar com as regras do lua)
    end

    return this
    end

    local option = switch()
    option.case(0, print).case(1, error)

    local userSelect = 0

    option.test(userSelect, "hello world!")

    faz a mesma coisa que o seu ...

    De toda forma, switch-cases em Lua não são realmente necessários, claro que usar um monte de ifs deixa feio mas perde a performance usar várias funções só para testar um valor ... Em python eu também tinha feito um switch case onde vc podia fazer:

    Code Python

    1
    2
    3
    4
    5
    6
    option = switch(input())

    @option.case("0")
    def foo(): print("bar")

    option.case("1", sys.exit, "closed by user")

    O jeito para implementar switch-cases é baixar o código fonte do lua e compilar sua própria versão, foi isso que fiz para corrigir o problema do metamethod __len no lua 5.1

    Achei o seu bem interessante, vou até testar. E sobre o Python, eu pretendo aprender também, e vou voltar nesse tópico só pra entender o que você escreveu kkkkk

    @edit: gostei do seu código, consiso e funcional :)

    @edit2: sua opinião faz sentido de Lua não precisar. If-else de mais fica realmente estranho. Em Lua nem tanto assim, até porque sua sintaxe é bem mais bonita (if/elseif/then/end), então demais não ficaria uma monstruosidade. Mas, por exemplo, em Javascript aquele jogo de {} as vezes fica estranho, ainda bem que Js tem switch kkkk

    Dernière modification le 1591182540000
    • Forums
    • /
    • Transformice
    • /
    • Modules
    • /
    • [Script] Switch-case em Lua?
    © Atelier801 2018

    Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

    Version 1.27