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.

Advertisements