背景
为了实现上篇最后所讲的创建新table的方法,需要解决如下几个问题:
- 如何支持设置原table中的值为nil
- 如何支持使用pairs遍历新table
代理表
支持设置原table中的值为nil的方案,首先得引入一个另外的方案 table代理的支持这个table代理能够让每次访问代理的调用都通过代理上的元表,实现如下:
function createNewTable(parent)
local values = {
} -- 用来存放新的值
-- 代理表,每次通过这个表访问和赋值都会经过下面元表的__index和__newindex方法
-- 新的值会存储到values表中,访问的时候先从values表中查找,如果没有找到,在去parent中查找
local proxy =
setmetatable(
{
},
{
__index = function(__, k)
local retValue = values[k]
if retValue ~= nil then
return retValue
end
return parent[k]
end,
__newindex = f