![]() |
Programming in Lua | ![]() |
Part II. Tables and Objects Chapter 13. Metatables and Metamethods |
Usually, tables in Lua have a quite predictable set of operations. We can add key-value pairs, we can check the value associated with a key, we can traverse all key-value pairs, and that is all. We cannot add tables, we cannot compare tables, and we cannot call a table.
Metatables allow us to change the behavior of a table.
For instance, using metatables,
we can define how Lua computes the expression a+b
,
where a
and b
are tables.
Whenever Lua tries to add two tables,
it checks whether either of them has a metatable
and whether that metatable has an __add
field.
If Lua finds this field, it calls the corresponding value
(the so-called metamethod, which should be a function)
to compute the sum.
Each table in Lua may have its own metatable. (As we will see later, userdata also can have metatables.) Lua always create new tables without metatables:
t = {} print(getmetatable(t)) --> nilWe can use
setmetatable
to set or change the
metatable of any table:
t1 = {} setmetatable(t, t1) assert(getmetatable(t) == t1)Any table can be the metatable of any other table; a group of related tables may share a common metatable (which describes their common behavior); a table can be its own metatable (so that it describes its own individual behavior). Any configuration is valid.
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. |
![]() |
![]() |