Note
Before reading this tutorial, you should know about metatables. An explanation of metatable exists in the Lua-Learning folder.
What are Proxy Tables?⚓︎
Proxy table are Tables that allow you to detect when a table is updated or changed using __newindex
How to set on up⚓︎
What we want to do it use __newindex to reference the Real Data inside of the Proxy Table.
We can set it up like this:
local Proxy = {}
Proxy.__newindex = function(self,key,value)
self.RealData[key] = value -- without this the key would need be set to the new value
print("Detected Change at",key,"new Value",value)
end
function Proxy.new(DataTable)
return setmetatable({RealData = DataTable or {}},Proxy)
end
return Proxy
This is basically all you need for a proxy table to function
local Proxy = require(Path.To.Proxy.Module)
local data ={
A = 1,
Hao = 2
}
local ProxyTable = Proxy.new(data)
ProxyTable.A = 2 --> Detected Change at A new Value 2
ProxyTable.B = 3 --> Detected Change at B new Value 3
ProxyTable.Hao = nil --> Detected Change at Hao new Value nil
Features you can add to your proxy table⚓︎
You can also add more features to the proxy table so that the proxy table can act like a normal table. here are some examples:
adding the __index metamethod
-- this will allow you to do ProxyTable["A"] normally to get the data
Proxy.__index = function(self,key)
return self.RealData[key]
end
--Example Use Case
print(ProxyTable.ProxyTable.A) -- > 2
print(ProxyTable.A) -- > 2
adding the __iter metamethod
-- this will allow the proxy table to be iterated by a for loop
Proxy.__iter = function(self)
return next,self.RealData -- similar to pairs(table)
end
--Example Use Case
for i,v in ProxyTable do
print(i,v) --> A 2 | B 3
end
-- this will allow the proxy table to be iterated by a for loop
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
--Example Use Case
ProxyTable.Changed.event:Connect(function(key,value)
print("table was modified")
end)
Conclusion⚓︎
If you think you're going to use RealData as a key name you can name the key to something random so that when you do ProxyTable.RealData={} it wouldn't override your real data with an empty table. Anyways thats it for this tutorial, hope this helps