有时,您不想触发元方法,而是真正地写或读给定的键,而没有一些巧妙的功能围绕访问进行包装。为此,lua为您提供了原始表访问方法:
-- first, set up a metatable that allows no read/write access local meta = { __index = function(object, index) -- raise an error error(string.format("the key '%s' is not present in object '%s'", index, object)) end, __newindex = function(object, index, value) -- raise an error, this prevents any write access to the table error(string.format("you are not allowed to write the object '%s'", object)) end } local t = { foo = "bar" } setmetatable(t, meta) -- both lines raise an error: --print(t[1]) --t[1] = 42 -- we can now circumvent this problem by using raw access: print(rawget(t, 1)) -- prints nil rawset(t, 1, 42) -- ok -- since the key 1 is now valid, we can use it in a normal manner: print(t[1])
这样,我们现在可以重写ower前__newindex一种方法,以将值实际写入表中:
meta.__newindex = function(object, index, value) print(string.format("writing the value '%s' to the object '%s' at the key '%s'", value, object, index)) rawset(object, index, value) end