I want to have a read only table in my Lua program. If ever a key is removed or a key is associated with a new value, an error must be thrown.

function readonly(table) local meta = { } -- metatable for proxy local proxy = { } -- this table is always empty meta.__index = table -- refer to table for lookups meta.__newindex = function(t, key, value) error("You cannot make any changes to this table!") end setmetatable(proxy, meta) return proxy -- user will use proxy instead end

It works great.

t = { } t["Apple"] = "Red" t[true] = "True!" t[51] = 29 for k,v in pairs(t) do print(v) end t = readonly(t) t[51] = 30

Prints

Red True! 29 input:7: You cannot make any changes to this table!

Problem

for k, v in pairs(t) do print(v) end

Will print nothing under all circumstances now. That's because the proxy table will never have anything inside of it. pairs apparently never calls index and thus cannot retrieve anything from the actual table.

What can I do to make this readonly table iterable?

I'm on Lua 5.1 and have access to these metamethods:

Lua 5.1 Manual