Note
在阅读本教程之前,您应该了解元表。有关元表的解释在 Lua-Learning 文件夹中存在。
什么是代理表?¶
代理表是一种允许您使用 __newindex 检测表在更新或更改时的表。
如何设置¶
我们想要做的是使用 __newindex 引用代理表内部的真实数据。
我们可以这样设置:
local Proxy = {}
Proxy.__newindex = function(self, key, value)
self.RealData[key] = value -- 如果没有这一行,键需要设置为新值
print("检测到", key, "处的更改,新值为", value)
end
function Proxy.new(DataTable)
return setmetatable({RealData = DataTable or {}}, Proxy)
end
return Proxy
基本上,这就是代理表需要的全部内容。
local Proxy = require(Path.To.Proxy.Module)
local data ={
A = 1,
Hao = 2
}
local ProxyTable = Proxy.new(data)
ProxyTable.A = 2 --> 检测到 A 处的更改,新值为 2
ProxyTable.B = 3 --> 检测到 B 处的更改,新值为 3
ProxyTable.Hao = nil --> 检测到 Hao 处的更改,新值为 nil
您可以添加到代理表的功能¶
您还可以向代理表添加更多功能,以使其像普通表一样运行。以下是一些示例:
添加 __index 元方法
-- 这将允许您像正常表一样使用 ProxyTable["A"] 获取数据
Proxy.__index = function(self, key)
return self.RealData[key]
end
-- 示例用法
print(ProxyTable.ProxyTable.A) -- > 2
print(ProxyTable.A) -- > 2
添加 __iter 元方法
-- 这将允许通过 for 循环迭代代理表
Proxy.__iter = function(self)
return next, self.RealData -- 类似于 pairs(table)
end
-- 示例用法
for i, v in ProxyTable do
print(i, v) --> A 2 | B 3
end
添加可绑定事件以用作更改事件
-- 这将允许通过 for 循环迭代代理表
Proxy.__newindex = function(self, key, value)
self.RealData[key] = value
self.Changed:Fire(key, value)
end
function Proxy.new(DataTable)
return setmetatable({RealData = DataTable or {}, Changed = Instance.new("BindableEvent")}, Proxy)
end
-- 示例用法
ProxyTable.Changed.event:Connect(function(key, value)
print("表已被修改")
end)
结论¶
如果您认为将使用 RealData 作为键名,您可以将键名命名为随机字符串,以便在执行 ProxyTable.RealData={} 时不会用空表覆盖您的真实数据。无论如何,这就是本教程的全部内容,希望对您有所帮助。