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 |
It is easy to adapt the concept of
proxies to implement read-only tables.
All we have to do is to raise an error whenever
we track any attempt to update the table.
For the __index metamethod,
we can use a table---the original table itself---instead of a function,
as we do not need to track queries;
it is simpler and quite more efficient to redirect all queries
to the original table.
This use, however,
demands a new metatable for each read-only proxy,
with __index pointing to the original table:
function readOnly (t)
local proxy = {}
local mt = { -- create metatable
__index = t,
__newindex = function (t,k,v)
error("attempt to update a read-only table", 2)
end
}
setmetatable(proxy, mt)
return proxy
end
(Remember that the second argument to error, 2,
directs the error message to where the update was attempted.)
As an example of use,
we can create a read-only table for weekdays:
days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
print(days[1]) --> Sunday
days[2] = "Noday"
stdin:1: attempt to update a read-only table
| Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |