跳转至

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={} 时不会用空表覆盖您的真实数据。无论如何,这就是本教程的全部内容,希望对您有所帮助。