Lua - Arrays with Metatables
Lua provides an interesting option to modify the behavior of an array. For example, to get a default value in case index is not present in the array instead of giving nil value.
A metatable is a mechanism by which we set another table for the array which can modify the array behavior with the help of a __index and related meta methods. These meta methods are powerful Lua functionality that enables features like −
Changing/adding functionalities to operators on array.
For example, Looking up metatables when the key is not available in the table using __index in metatable.
There are two important methods that are used in handling metatables which includes −
setmetatable(table,metatable) − This method is used to set metatable for a table.
getmetatable(table) − This method is used to get metatable of a table.
Syntax - Setting MetaTable
Let's first look at how to set one table as metatable of another. It is shown below.
array = {}
mymetatable = {}
setmetatable(array)
The above code can be represented in a single line as shown below.
array = setmetatable({},{})
Example - Using _index to get a default value in an array
A simple example of metatable for looking up the meta table when it's not available in array is shown below.
main.lua
array = { 1, 2, 3, 4, 5, 6 }
-- set the metatable
setmetatable(array, {
-- self represent the table on which metatable is applied
-- index is the non-existing index
__index = function(self, index)
return "0"
end
})
-- print value using existing index
print(array[5])
-- print value using non-exiting index
print(array[8])
Output
When we run the above program, we will get the following output−
5 0
Let us explain what happened in the above example in steps.
The array here is {1, 2, 3, 4, 5, 6}. By default, index starts from 1.
Metatable is set for mytable that contains a function for __index, which we call as a metamethod.
The metamethod does a simple job of looking up for an index. If a non-existing index is passed to the table, then a default value of 0 is returned, otherwise the corresponding value is printed.
Example - Using _index to get an error message for an invalid index
we can set and use metatable to return an error message as well for an invalid index−
main.lua
numbers = { -1, -2, -3, -4, -5, -6}
-- set the metatable
setmetatable(numbers, {
-- self represent the table on which metatable is applied
-- index is the non-existing index
__index = function(self, index)
return "Invalid Index."
end
})
-- print value using existing used
print(numbers[1])
-- print error message if non-exiting index is used
print(numbers[7])
Output
When we run the above program, we will get the following output−
-1 Invalid Index.
Explanation
The table numbers is a numerically indexed table.
Metatable is set on numbers table that contains a function for __index, which we call as a metamethod.
The metamethod does a simple job of looking up for an index. If a non-existing index is passed to the table, then an error message is returned, otherwise the corresponding value is printed.