Skip to content

Instantly share code, notes, and snippets.

@FreeBirdLjj
Last active November 2, 2024 22:29
Show Gist options
  • Save FreeBirdLjj/6303864 to your computer and use it in GitHub Desktop.
Save FreeBirdLjj/6303864 to your computer and use it in GitHub Desktop.
A way to write switch-case statements in lua.
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
}
@RichardFevrier
Copy link

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