Beim Versuch, Metatables durchzusenden, ist ein Problem aufgetreten TriggerEvent
und dachte schließlich an eine einfache Lösung dafür.
Klasse FIle
[email protected] Something
Something = setmetatable({}, Something)
Something.__call = function()
return "Something"
end
Something.__index = Something
function Something.new(name)
local _Something = {
Name = name
}
return setmetatable(_Something, Something)
end
function Something:Hello()
print("My name is " .. self.Name)
end
function Something:SetName(name)
print("Setting name to ", name)
self.Name = name
end
Eine weitere Datei, die die Something-Klasse instanziiert und einem Array zur späteren Indizierung hinzufügt. dh Ein Array von aktuell angemeldeten Benutzern. Dieses enthält auch die “magische” Funktion
local something = Something.new("Bob")
[email protected] tb table
function toPack(tb)
local tmpObj = {}
local tmpMt = getmetatable(tb) or {}
for k,v in pairs(tb) do
tmpObj[k] = v
end
for k,v in pairs(tmpMt) do
if k ~= "__index" and k ~= "__call" and k ~= "new" then
tmpObj[k] = v
end
end
for k,v in pairs(tmpObj) do
if type(v) == "function" then
tmpObj[k] = function(...)
v(tmpObj, ...)
end
end
end
return tmpObj
end
local mySomething = toPack(something)
local Cache = {}
Cache[1] = mySomething
RegisterCommand('doit', function()
TriggerEvent('server:do', Cache[1])
end)
RegisterCommand('first', function()
Cache[1].Hello()
end)
Eine weitere Datei, die die Tabelle empfängt und Funktionen darauf bearbeiten / ausführen möchte
RegisterServerEvent('server:do')
AddEventHandler('server:do', function(something)
something.Hello()
something.SetName("Something")
end)
Die Idee der “magischen” Funktion besteht darin, alle auf der Metatable vorhandenen Funktionen zusammen mit einer umschlossenen Funktion, die sich selbst als die übergibt, der Tabelle selbst neu zuzuweisen self
Parameter für die Benutzerfreundlichkeit.
Dies ermöglicht auch die Veränderbarkeit des ursprünglichen Objekts durch MessagePack, dh den Aufruf von SetName
in der 3rd Datei kann die mutieren Name
Eigentum von Cache[1]
Könnte die Klasse wahrscheinlich anders gestalten, um dies nicht zu erfordern (z. B. eine Funktion, die einfach eine Tabelle zurückgibt), aber dies war meine Lösung, wenn Klassen auf diese Weise verwendet werden sollten