This first edition was written for Lua 5.0. While still largely relevant for later versions, there are some differences.
The fourth edition targets Lua 5.3 and is available at Amazon and other bookstores.
By buying the book, you also help to support the Lua project.
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. |