2.4 – Metatables and Metamethods
Every value in Lua can have a metatable. This metatable is an ordinary Lua table that defines the behavior of the original value under certain special operations. You can change several aspects of the behavior of operations over a value by setting specific fields in its metatable. For instance, when a non-numeric value is the operand of an addition, Lua checks for a function in the field “__add
“ of the value’s metatable. If it finds one, Lua calls this function to perform the addition.
The key for each event in a metatable is a string with the event name prefixed by two underscores; the corresponding values are called metamethods. In the previous example, the key is “__add
“ and the metamethod is the function that performs the addition. Unless stated otherwise, metamethods should be function values.
You can query the metatable of any value using the getmetatable
function. Lua queries metamethods in metatables using a raw access (see rawget
). So, to retrieve the metamethod for event ev
in object o
, Lua does the equivalent to the following code:
- rawget(getmetatable(o) or {}, "__ev")
You can replace the metatable of tables using the setmetatable
function. You cannot change the metatable of other types from Lua code (except by using the debug library (§6.10)); you should use the C API for that.
Tables and full userdata have individual metatables (although multiple tables and userdata can share their metatables). Values of all other types share one single metatable per type; that is, there is one single metatable for all numbers, one for all strings, etc. By default, a value has no metatable, but the string library sets a metatable for the string type (see §6.4).
A metatable controls how an object behaves in arithmetic operations, bitwise operations, order comparisons, concatenation, length operation, calls, and indexing. A metatable also can define a function to be called when a userdata or a table is garbage collected (§2.5).
For the unary operators (negation, length, and bitwise NOT), the metamethod is computed and called with a dummy second operand, equal to the first one. This extra operand is only to simplify Lua’s internals (by making these operators behave like a binary operation) and may be removed in future versions. (For most uses this extra operand is irrelevant.)
A detailed list of events controlled by metatables is given next. Each operation is identified by its corresponding key.
__add
: the addition (+
) operation. If any operand for an addition is not a number (nor a string coercible to a number), Lua will try to call a metamethod. First, Lua will check the first operand (even if it is valid). If that operand does not define a metamethod for__add
, then Lua will check the second operand. If Lua can find a metamethod, it calls the metamethod with the two operands as arguments, and the result of the call (adjusted to one value) is the result of the operation. Otherwise, it raises an error.__sub
: the subtraction (-
) operation. Behavior similar to the addition operation.__mul
: the multiplication (*
) operation. Behavior similar to the addition operation.__div
: the division (/
) operation. Behavior similar to the addition operation.__mod
: the modulo (%
) operation. Behavior similar to the addition operation.__pow
: the exponentiation (^
) operation. Behavior similar to the addition operation.__unm
: the negation (unary-
) operation. Behavior similar to the addition operation.__idiv
: the floor division (//
) operation. Behavior similar to the addition operation.__band
: the bitwise AND (&
) operation. Behavior similar to the addition operation, except that Lua will try a metamethod if any operand is neither an integer nor a value coercible to an integer (see §3.4.3).__bor
: the bitwise OR (|
) operation. Behavior similar to the bitwise AND operation.__bxor
: the bitwise exclusive OR (binary~
) operation. Behavior similar to the bitwise AND operation.__bnot
: the bitwise NOT (unary~
) operation. Behavior similar to the bitwise AND operation.__shl
: the bitwise left shift (<<
) operation. Behavior similar to the bitwise AND operation.__shr
: the bitwise right shift (>>
) operation. Behavior similar to the bitwise AND operation.__concat
: the concatenation (..
) operation. Behavior similar to the addition operation, except that Lua will try a metamethod if any operand is neither a string nor a number (which is always coercible to a string).__len
: the length (#
) operation. If the object is not a string, Lua will try its metamethod. If there is a metamethod, Lua calls it with the object as argument, and the result of the call (always adjusted to one value) is the result of the operation. If there is no metamethod but the object is a table, then Lua uses the table length operation (see §3.4.7). Otherwise, Lua raises an error.__eq
: the equal (==
) operation. Behavior similar to the addition operation, except that Lua will try a metamethod only when the values being compared are either both tables or both full userdata and they are not primitively equal. The result of the call is always converted to a boolean.__lt
: the less than (<
) operation. Behavior similar to the addition operation, except that Lua will try a metamethod only when the values being compared are neither both numbers nor both strings. The result of the call is always converted to a boolean.__le
: the less equal (<=
) operation. Unlike other operations, the less-equal operation can use two different events. First, Lua looks for the__le
metamethod in both operands, like in the less than operation. If it cannot find such a metamethod, then it will try the__lt
metamethod, assuming thata <= b
is equivalent tonot (b < a)
. As with the other comparison operators, the result is always a boolean. (This use of the__lt
event can be removed in future versions; it is also slower than a real__le
metamethod.)__index
: The indexing access operationtable[key]
. This event happens whentable
is not a table or whenkey
is not present intable
. The metamethod is looked up intable
.Despite the name, the metamethod for this event can be either a function or a table. If it is a function, it is called with
table
andkey
as arguments, and the result of the call (adjusted to one value) is the result of the operation. If it is a table, the final result is the result of indexing this table withkey
. (This indexing is regular, not raw, and therefore can trigger another metamethod.)__newindex
: The indexing assignmenttable[key] = value
. Like the index event, this event happens whentable
is not a table or whenkey
is not present intable
. The metamethod is looked up intable
.Like with indexing, the metamethod for this event can be either a function or a table. If it is a function, it is called with
table
,key
, andvalue
as arguments. If it is a table, Lua does an indexing assignment to this table with the same key and value. (This assignment is regular, not raw, and therefore can trigger another metamethod.)Whenever there is a
__newindex
metamethod, Lua does not perform the primitive assignment. (If necessary, the metamethod itself can callrawset
to do the assignment.)__call
: The call operationfunc(args)
. This event happens when Lua tries to call a non-function value (that is,func
is not a function). The metamethod is looked up infunc
. If present, the metamethod is called withfunc
as its first argument, followed by the arguments of the original call (args
). All results of the call are the result of the operation. (This is the only metamethod that allows multiple results.)
It is a good practice to add all needed metamethods to a table before setting it as a metatable of some object. In particular, the __gc
metamethod works only when this order is followed (see §2.5.1).
Because metatables are regular tables, they can contain arbitrary fields, not only the event names defined above. Some functions in the standard library (e.g., tostring
) use other fields in metatables for their own purposes.