2010-12-22 12 views
0

Ich bekomme einen Verweis auf eine Lua-Methode, die innerhalb einer Klasse mit der Funktion LuaL_ref ist. Wenn ich diese Methode aufrufen möchte, verwende ich die Funktion lua_rawgeti, um die Funktion in den Stapel zu schieben, und dann lua_pcall, um die Methode tatsächlich aufzurufen. Alles funktioniert gut, außer dass ich nicht auf andere Klassenmitglieder zugreifen kann, weil self null ist.Lua: Wie referenziere ich eine Lua-Methode innerhalb einer Lua-Klasse von C für den späteren Gebrauch?

Weiß jemand wie ich das beheben kann?

Vielen Dank!

Antwort

0

Der Lua-Doppelpunktoperator verwendet syntaktischen Zucker, um die Tabelle, auf die verwiesen wird, als den ersten Parameter (a.k.a. self) in einem Funktionsaufruf zu platzieren. Sie sollten in der Lage sein, die Tabelle (Objekt) als ersten Parameter für den Funktionsaufruf zu verwenden, und Ihr Problem sollte behoben sein.

2

Lua "Methoden" sind eigentlich Funktionen. Sie haben keine Ahnung von self wie in anderen Sprachen. Wie gut sagt, die obj:method(...) ist eigentlich syntaktischer Zucker für obj.method(obj, ...).

Wenn Sie mit Objekten arbeiten müssen, speichern Sie keine Verweise auf Objektfunktionen - speichern Sie den Verweis auf das Objekt selbst. Sie können den folgenden Code verwenden, um ein Verfahren unter Verwendung von Lua C API aufrufen:

/* get the object, idx is the identifier returned by luaL_ref */ 
lua_rawgeti(L, LUA_REGISTRYINDEX, idx); 
lua_getfield(L, -1, "method"); 
/* push parameters - the object first, then the rest, then call the function */ 
lua_pushvalue(L, -2); 
... 
lua_call(L, nParams + 1, 1); 
+0

Wenn jedoch eine Funktion als 'function obj: foo() print (self.property) end' definiert wird, wird der self-Parameter _is_ impliziert. – jpjacobs

+0

Nun, ja, wenn Sie Ihre Funktion als 'Funktionsklasse: Methode (a, b)' definieren, dann hat es tatsächlich drei Parameter - 'self',' a', 'b'. Sie können dem ersten Parameter einen beliebigen Namen geben, indem Sie die Syntax 'function Class.method (this, a, b)' verwenden. Aber das ändert nichts an der Lösung - das Objekt anstelle der Methode referentieren (aber Sie müssen den Methodennamen kennen). Das Aufrufprotokoll soll dann das Objekt als ersten Parameter an die Methode übergeben, gefolgt von dem Rest. –

0

Also, wenn ich das richtig verstanden habe, wenn ich einen Verweis auf die Selbst Tabelle und einen Verweis auf die Klassenmethode speichern, dann könnte ich schiebe die Selbst in den Stapel, dann die Methode und es sollte funktionieren ... aber es tut nicht ... Machst du jetzt warum ??

Verwandte Themen