Lua - Metatables vs Metamethods
Metatables and metamethods constitutes a very powerful mechanism in Lua by which Lua allows us to modify the default behavior of operations on a Lua table. In this chapter, we're discussing both metatables and metamethods in details and their differences.
Metatables
Definition
A metatable is similar to normal Lua table with the exception that it is associated with the table. A metatable defines set of operations or instructions which determine the behavior of the associated table.
Purpose of a metatable
Main purpose of a metatable is to modify the default behavior of the table like if a table is returing nil by default when a non-existing key is accessed but we want a different default value to be returned in such a scenario. A metatable can be used to provide a controlled access to the associated table, or do operator overloading for it.
Association
Only one metatable can be associated with a table at a time. We associated a metatable using setmetatable() method.
Content of Metatable
A metatable have special fields where key of the these fields have predefined name starting with double underscore like __index. When we associate a value with these fields, the value is termed as metamethod.
Metamethods
Definition
A metamethod is a function assigned as a value to the predefined keys of the metatable. For example, functions assigned to __index, __newindex and so on are metamethods.
Purpose of a metamethod
Metamethod is a action which is performed by Lua when a corresponding action is taken on the associated table with the respective metatable. When Lua encounter a situation where main table is not having a clear information as what is to be done, Lua searches for the associated metatable for the relevant metamethod. Once found, Lua executes the metamethod to handle the operation.
How a metamethod triggers
A metamethod are not called directly. Lua invokes a metamethod when a particular event or operation happens on the associated table,
Examples of metamethods
When a non-existing key is accessed in a Lua table, Lua searches for __index metamethod in the associated metatable.
If we try to add two tables using + operator, Lua searches for __add metamethod in the associated metatable for any of tables.
In case we call a table as a function, __call metamethod in the associated metatable is invoked.
Differences between Metatable and Metamethod
Following table summarises the differences between a metatable and a metamethod.
| Sr.No. | Feature | Metatable | Metamethod |
|---|---|---|---|
| 1 | Definition | A metatable is a Lua Table to modify another table's default behavior. | A metamethod is a function within a metatable which define a certain behavior. |
| 2 | Type | A metatable is a Table. | A metamethod is a Function. |
| 3 | Purpose | Purpose of a metatable is to customize the behavior of associated table. | A metamethod purpose is to implement the custom behavior for a particular operation. |
| 4 | Invocation | A metatable is not used directly. It is simply a container for metamethods. | A metamethod is invoked implicitly by Lua on occurence of related event. |
| 5 | Content | A metatable content is a set of metamethods as key-value pairs. | A metamethod content is the implementation of lua code to handle the related operation. |
Conclusion
A metatable is primarily a container to customize the behavior of another table and a metamethod is a specialized function within that metatable to define a custom behavior overriding the default behavior of action on associated table.