Functions cannot be overloaded, at least not at compile time.
However, you can 'overload' based on the types of the arguments you receive. Say we need a function which can operate on one or many numbers:
function overload(num)
if type(num) == 'table' then
for i,v in ipairs(num) do
overload(v)
end
elseif type(num) == 'number' then
dosomethingwith(num)
end end
The usual operators can be overloaded using metamethods. If an object (either a Lua table or C userdata) has a metatable then we can control the meaning of the arithmetic operators (like + - * / ^), concatenation .., calling () and comparison operators == ~= < >.
Overriding () allows for 'function objects' or functors, which can be used wherever Lua expects something that is callable.
Note a restriction on overloading operators like ==: both arguments must be of the same type. You cannot create your own SuperNumber class and get sn == 0 to work, unfortunately. You would have to create an instance of
SuperNumber called Zero and use that in your comparisons.
You can control the meaning of a[i] but this is not strictly speaking overloading the [] operator. __index fires when Lua cannot find a key inside a table. __index can be set to either a table or to a function; objects are often implemented by setting __index to be the metatable itself, and by putting the methods in the metatable. Since a.fun is equivalent to a['fun'], there is no way to distinguish between looking up using explicit indexing and using a dot. A naive Set class would put some methods in the metatable and store the elements of the set as keys in the object itself. But if Set a method 'set', then
s['set'] would always be true, even though 'set' would not be a member of the set.
The size operator and action when garbage-collected can be overridden by C extensions, not by plain Lua 5.1. This is restriction has been removed for Lua 5.2.