Last active
January 23, 2025 00:48
-
-
Save FreeBirdLjj/6303864 to your computer and use it in GitHub Desktop.
A way to write switch-case statements in lua.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
print "Hello, switch" | |
-- If the default case does not have to be handled, we can use the following auxiliary function: | |
local function switch(value) | |
-- Handing `cases` to the returned function allows the `switch()` function to be used with a syntax closer to c code (see the example below). | |
-- This is because lua allows the parentheses around a table type argument to be omitted if it is the only argument. | |
return function(cases) | |
-- The default case is achieved through the metatable mechanism of lua tables (the `__index` operation). | |
setmetatable(cases, cases) | |
local f = cases[value] | |
if f then | |
f() | |
end | |
end | |
end | |
-- Suppose we want to write the equivalent lua code of the following c code: | |
-- switch (a) { | |
-- case 1: | |
-- printf("Case 1.\n"); | |
-- break; | |
-- case 2: | |
-- printf("Case 2.\n"); | |
-- break; | |
-- case 3: | |
-- printf("Case 3.\n"); | |
-- break; | |
-- default: | |
-- printf("Case default.\n"); | |
-- } | |
local x = 2 | |
switch (x) { | |
[1] = function() -- for case 1 | |
print "Case 1." | |
end, | |
[2] = function() -- for case 2 | |
print "Case 2." | |
end, | |
[3] = function() -- for case 3 | |
print "Case 3." | |
end, | |
__index = function() -- for case default, can be omitted if not needed | |
print "Case default." | |
end | |
} |
Also, I just realized that I use a simple Lua idiom that basically works like switch-case (not exactly, but it's very similar). I'll leave it there, I hope someone may find it useful:
print "Hello, switch"
local x = 2
local result =
x == 1 and "Case 1."
or x == 2 and "Case 2."
or x == 3 and "Case 3."
or "Case default."
print(result)
This removes the need of using metatable entirely.
Also, I just realized that I use a simple Lua idiom that basically works like switch-case (not exactly, but it's very similar). I'll leave it there, I hope someone may find it useful:
print "Hello, switch" local x = 2 local result = x == 1 and "Case 1." or x == 2 and "Case 2." or x == 3 and "Case 3." or "Case default." print(result)This removes the need of using metatable entirely.
The benefits of using switch-case over if-elif-else is to not repeat the x
variable... otherwise there is no point, like in your example.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey @FreeBirdLjj,
Gosh... Lua shocks me everyday with its meta-programming capabilities. This indeed works.
I wonder about performance penalty of said approach as it uses
coroutine
?Using fallthrough here kinda skyrockets the complexity, since every falling
case N
must explicitly callfallthrough N+1
and adding/removing cases becomes complicated, so not sure if this is a great solution. Maybe something like this [code bellow] would be better in a long run.Thanks for your answer though, I haven't thought this would be even possible.