Lua Table-Access Metamethods

Table access metamethods (Lua) provide a mechanism for handling table lookup using the __index metamethod and writes to missing keys, using the __newindex metamethod. They are the foundation for object-oriented programming in Lua using Object and are also useful for creating read-only tables, tables with default values and tracking tables access.

The __index field in a metatable can either refer to a function that will be called each time a missing key is looked up or another table which will be looked up if the original table doesn't have the key.

In this example, I'm creating a read-only table by pointing __index to the table with the data we're interested in and __newindex to a function that will raise an error. Note that the proxy table has to remain empty in order for __newindex to be called

function readOnly(t)
    local mt = {
        __index = t ,
        __newindex = function(t, v, k)
            error('Table cannot be written to', 2)
    local proxy = {}  -- will remain empty
    setmetatable(proxy, mt)
    return proxy

local constants = readOnly({"One", "Two", "Three"})
print(constants[1])  -- return 1
constants[1] = "Two"  -- should raise read-only error