Ich habe eine benutzerdefinierte Tabelle mit Metatabellen erstellt, die die Größe automatisch verfolgt, wenn Elemente hinzugefügt werden. Es funktioniert sehr gut und beseitigt die Notwendigkeit für den Operator oder die getn
Funktion.table.insert löst keinen __index aus?
Allerdings hat es ein Problem. Wenn Sie table.insert
aufrufen, ruft die Funktion anscheinend niemals __index
oder __newindex
auf. Daher kann meine Tabelle nicht wissen, wann Elemente auf diese Weise entfernt werden. Ich nehme an, das Problem ist das gleiche mit table.remove
auch.
Wie kann ich entweder:
- Capture the Falle
insert
und meine eigene Funktion verwenden, dies zu tun - einen Fehler aus, wenn
insert
auf meinem Tisch genannt wird.
Dank
function Table_new()
local public = { }
local tbl = { }
local size = 0
function public.size()
return size
end
return setmetatable(public, {
__newindex = function(t, k, v)
local previous_v = tbl[k]
rawset(tbl, k, v)
if previous_v ~= nil then
if v == nil then
size = size - 1
end
elseif v ~= nil then
size = size + 1
end
end,
__index = tbl
})
end
local t = Table_new()
t[5] = "hi"
t[17] = "hello"
t[2] = "yo"
t[17] = nil
print(t.size()) -- prints 2
local z = Table_new()
table.insert(z, "hey")
table.insert(z, "hello")
table.insert(z, "yo")
print(z.size()) -- prints 1 -- why?
@lhf Sorry, als ich mein Beispiel erneut eingegeben habe, habe ich diesen Fehler gemacht. Ich habe meine Frage aktualisiert, die das Problem hat und bezieht sich nicht auf Variablen, die nicht existieren, haha. – Hatefiend
Auf Lua 5.1 druckt Ihr Programm "0", nicht "1". –
@EgorSkriptunoff Das ist komisch. Ich habe den Interpreter auf [Lua's Demoseite] (https://i.imgur.com/L8xrmmO.png) nur für dieses Beispiel benutzt. Warum sollte es verschiedene Ergebnisse drucken? [Sie haben jedoch Recht] (https://i.imgur.com/FnAPt1E.png). Ich verstehe nicht warum. – Hatefiend