2017-12-29 18 views
2

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? 
+0

@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

+0

Auf Lua 5.1 druckt Ihr Programm "0", nicht "1". –

+0

@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

Antwort

1

Wenn Sie k, v in __newindex drucken, werden Sie, dass k sehen ist immer 1. Dies liegt daran, table.insert für die Größe der Tabelle fragt, wo zu finden, um den Wert legen . Standardmäßig ist es am Ende. Sie sollten ein __len Metamethod hinzufügen. Aber vielleicht schlägt das deine Ziele (die mir dunkel sind).

+0

Leider bin ich auf Lua 5.1 und habe keinen Zugriff auf '__len' oder' # '. Gibt es andere Problemumgehungen? – Hatefiend

+0

Eigentlich denke ich, dass es immer '1' als Schlüssel bekommt, weil es sieht, dass die Tabelle keine Elemente hat, also versucht es, es in den Index' 1' zu setzen, was funktioniert. Allerdings hat die Proxy-Tabelle von 'public' immer noch eine Größe von' 1', also versucht sie wieder bei '1' einzufügen? Ist das der Zyklus, von dem du gesprochen hast? – Hatefiend

Verwandte Themen