![]() |
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. |
|
![]() |