2013-06-17 9 views
6

Ich konnte Funktionen in einer Tabelle speichern. Aber jetzt habe ich keine Ahnung, wie ich sie aufrufen soll. Die finale Tabelle wird ungefähr 100 Aufrufe haben. Wenn möglich, möchte ich sie wie in einer foreach-Schleife aufrufen. Vielen Dank!Lua - Ausführen einer in einer Tabelle gespeicherten Funktion

Hier ist, wie die Tabelle definiert wurde:

game_level_hints = game_level_hints or {} 
game_level_hints.levels = {} 
game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     }, 
     [on_scene("scene1")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     } 
    } 
end 

aaand die Funktionsdefinitionen:

function on_scene(sceneId) 
    -- some code 
    return sceneId 
end 

function talk(areaId) 
    -- some code 
    return areaId 
end 

EDIT:

ich die Funktionen verändert, so dass sie ein wenig haben werden mehr Kontext. Im Grunde geben sie jetzt Strings zurück. Und was ich mir erhofft hatte ist, dass ich am Ende des Aufrufs der Funktionen eine Tabelle (idealerweise die Levels-Tabelle) mit all diesen Strings haben werde.

+1

Es ist nicht klar, wie oder was Sie in der Schleife aufgerufen werden soll. Vielleicht kannst du Pseudo-Code erklären und geben. BTW-Lua hat keine Zeiger. Funktionen sind Werte vom Typ 'function' und können überall in Ausdrücken verwendet werden. –

+0

@TomBlodget, vielen Dank, dass Sie darauf hingewiesen haben. Ich habe es korrigiert. – brain56

Antwort

4

Mit was euch beantwortet und kommentiert, konnte ich mit dem folgenden Code als Lösung kommen:

asd = game_level_hints.levels["level0"]() 

Jetzt enthält asd die Bereichsstrings, die ich brauche. Obwohl im Idealfall, ich wollte der Lage sein, auf die Daten zuzugreifen, wie:

asd[1][1] 

Zugriff auf sie mag:

asd["scene0"][1] 

würde die Bereichsdaten abzurufen ausreichen. Ich muss nur um die Tasten herum arbeiten.

Danke, Leute.

+0

Das könnte man wohl mit Metatables machen, aber es lohnt sich auch nicht;) – dualed

1

Es ist nicht wirklich klar, was Sie zu tun versuchen. In Ihrer anonymen Funktion geben Sie eine Tabelle zurück, die den Rückgabewert on_scene als Schlüssel verwendet. Aber Ihre on_scene gibt nichts zurück. Das gleiche gilt für talk.

Ich gehe davon aus, dass Sie wollten on_scene und talk aufgerufen werden, wenn Sie jede Ebene in Ihrer Tabelle game_level_hints aufrufen.

Wenn ja, das ist, wie Sie es tun können:

local maxlevel = 99 
for i = 0, maxlevel do 
    game_level_hints.levels["level" .. i] = function() 
    on_scene("scene" .. i) 
    talk("hint" .. i) 
    end 
end 
-- ... 
for levelname, levelfunc in pairs(game_level_hints.levels) do 
    levelfunc() 
end 
6

Kurze Antwort: eine Funktion (Referenz) in einem Array gespeichert nennen, die Sie gerade (parameters) hinzufügen, wie Sie es normalerweise tun würde:

local function func(a,b,c) return a,b,c end 
local a = {myfunc = func} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

In der Tat, können Sie dies vereinfachen

local a = {myfunc = function(a,b,c) return a,b,c end} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

Lange Antwort: Sie tun nicht dem Kritisieren Sie, was Ihre erwarteten Ergebnisse sind, aber was Sie geschrieben haben, ist wahrscheinlich nicht zu tun, was Sie erwarten, es zu tun. Nehmen Sie dieses Fragment:

game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
     } 
    } 
end 

[Dieser Absatz gilt nicht mehr, nachdem die Frage aktualisiert wurde] Sie verweisen on_scene und talk Funktionen, aber Sie nicht „speichern“ diese Funktionen in der Tabelle (da Sie explizit auf sie in Ihrer Frage verwiesen, nehme ich an, die Frage ist über diese Funktionen). Sie tatsächlich Anruf diese Funktionen und speichern die Werte, die sie zurückgeben (sie beide nil zurückgeben), wenn dieses Fragment ausgeführt wird, erhalten Sie "Tabellenindex ist Null" Fehler, wie Sie versuchen, nil mit nil als Index zu speichern.

Wenn Sie die Funktion, die Sie in game_level_hints.levels["level0"] gespeichert anrufen möchten, tun Sie nur game_level_hints.levels["level0"]()

Verwandte Themen