Tables als Key - Zugriff über Indexe?

  • Hallo,


    da der Titel dann doch etwas konfus klingt muss ich wahrscheinlich genau erläutern.
    In Key-Value-Tables kann der Key ja ne eigene Table sein. Wenn ich jenen Key nicht kenne, wie kann ich darauf zugreifen? Ein Beispiel:


    Ich weiß die Class sieht so aus:
    [lua]testClass = {
    ["table: 0A23AD78"] = { ... };
    ["table: 0A23AD79"] = { ... };
    ["table: 0D13A618"] = { ... };
    }
    [/lua]
    Es werden zweieinhalb Sachen passieren die ich so nicht erwartet hätte:

    • table.getn(testClass) wird 0 sein, dazu gleich mehr.
    • for i=1, #testClass do wird nicht einmal durchlaufen, eben weil getn 0 (null) ist.
    • Selbst ein arbiträr getestetes testClass[1] bringt nil.


    Meine Theorie ist folgende: die tables in testClass sind nur die keys, nicht die values, evtl. hat testClass nichtmal values (wobei man eigentlich erwarten sollte das wäre der Inhalt der tables). Nicht existierende values (nil) heißen in lua normalerweise dass der Wert in testClass nicht existiert, bzw. zumindest nicht aufgerufen werden kann. Und wenn alle values nil sind, wird getn daher 0 auswerfen.


    Ich weiß, das ist dreimal um die Ecke gedacht, aber anders kann ich mir es nicht erklären.


    Wer es selbst mal ausprobieren möchte kann sich gerne die g_currentMission.tipTriggers printen lassen und dann getn, for usw. ausprobieren.


    Bin für jegliche Aufklärung dankbar,
    --Jakob

  • Gut, aus irgendnem Grund hatte ich sogar inpairs vergessen - danke dafür. Nun komm ich also, aber nicht ganz so wie ich will.


    Wenn ich jetzt den jeweiligen Key hab (sagen wir ich hol ihn mir in der load()) kann ich trotzdem nicht distinkt auf eine der Tables zugreifen. Von meinem Bsp. im ersten Post: ich könnte nicht testClass["table: 0A23AD78"] aufrufen um dann wirklich auf jene (erste) Table zu kommen. Warum, weiß ich nicht (naja, wird irgendwas von wegen string vs. table sein), ich weiß nur dass er nil auswirft.


    Selbst wenn ich die Table als Variable vorher abspeicher und sie dann direkt als Key benutze läuft das nicht.
    [lua]x = die table aus der for-Schleife
    g_currentMission.tipTriggers[x] = ... wird nil sein[/lua]
    Ich denk mal da hat die Variable zwar den selben inhalt, aber irgendnen anderen Hashwert.


    Das alles hat zur Folge dass ich wieder nur über for/inpairs in der update() (oder woauchimmer ich's brauche) reinkomme. Sowas von unperformant

  • Wenn man nur einzelne Werte braucht und die Keys dazu kennt ist es auf jeden Fall inperformant.



    Nach etwas Research hab ich aber eine Idee, die man zumindest mal probieren kann. Obs klappt ist natürlich eine andere Sache.
    Mit einer for-Schleife über die Tabelle gehen (einmalig), dabei dann die Values (oder Keys, ist in diesem Fall beide gleich) in eine Arbeitstabelle mit brauchbarem Index speichern, also etwa so:
    [lua]i=1;
    workTable = {};
    for k,v in pairs(g_currentMission.tipTriggers) do
    workTable[i] = v;
    i = i+1;
    end;[/lua]
    Zugriff auf die einzelnen Trigger müsste dann so gehen:
    [lua]g_currentMission.tipTriggers[workTable[i]][/lua]
    Idee dazu kam als ich was zu Referenzen von Objekten gelesen habe: http://www.lua.org/pil/2.5.html und dann was zu Keys als Indices verwenden: http://lua-users.org/wiki/TablesTutorial
    Habs selbst nicht ausprobiert, aber anhand der beiden Seiten klingt das auf jeden Fall vielversprechend.

  • Deine Methode hatte ich ja in meinem letzten Post quasi auch kurz angedeutet, nur dass ich beim Probieren damals k und nicht v gesetzt hatte. Vielleicht (oder eher wahrscheinlich) hatte ich mich auch irgendwo vertan, verschrieben, was auch immer, auf jeden Fall funktionierte es nicht.


    Nun aber nochmal probiert, diesmal eben mit dem auch von dir benutzten v, und siehe da ... läuft. Auch wenn ich nicht verstehe warum das geht. Ich hab mir mal die workTable, bzw. mein Äquivalent dazu ausgeben lassen - die ist indexbasiert, wobei v der Content der Table ist... wieder mal so ne Sache wo ich lerne LUA zu hassen. Und/oder Giants dafür dass sie Tables als Keys benutzen.


    Jedenfalls geh ich jetzt durch die Methode von ca. 40 Abfragen auf um die 6 runter, was mich dann doch erfreut. Also danke nochmals.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!