Skip to content

Instantly share code, notes, and snippets.

@FreeBirdLjj
Last active July 14, 2024 17:46
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
}
@sleeptightAnsiC
Copy link

sleeptightAnsiC commented Jul 14, 2024

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment