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.

Advertisements