Ich habe eine Tabelle wie dieseWie implementiert man eine Trace-Funktion für Tabelle zu Funktionen?
local ftable = {
getPinId = app.getPinId
}
ftable an eine andere Funktion übergeben wird, die es als eine RPC-Schnittstelle exportiert. Das funktioniert, aber jetzt möchte ich Funktionsaufrufverfolgung zu einer Protokolldatei hinzufügen.
Der einfache Ansatz ist
local ftable = {
getPinId = function(...) print("getPinId") app.getPinId(...) end
}
Aber, das ist nicht besonders schön ist. Ich mag etwas setzen wie:
local trace = function(func, ...)
return function(...) print(func) func(...) end
end
local ftable = {
getPinId = trace(app.getPinId)
}
Aber diese produzieren nicht ganz das gewünschte Ergebnis. Die Parameter werden nicht übergeben.
Eine andere Möglichkeit ist, eine Metatabelle wie diese verwenden:
local ftable = {}
setmetatable(ftable, {
__index = function(_, k)
printf("Call: app.%s\n", k) return app[k] end
})
Welche funktioniert. Aber ich möchte auch die Parameter, die nach Möglichkeit übergeben werden, drucken können.
Irgendwelche Vorschläge? Ich verwende ausschließlich luajit, wenn das einen Unterschied macht. stattdessen
Ihr Code sollte funktionieren, außer dass es die Adresse der Funktion, nicht seinen Namen, druckt. Bitte zeigen Sie ein Beispiel für den Fehler, den Sie melden. – lhf
Das stimmt, ich habe versucht, die debug.getinfo Funktion, aber das hat nicht geholfen. Es behandelt es wie eine anonyme Funktion. Ich denke, ich könnte den Namen weitergeben. Im Moment verwende ich die Metatable-Methode, die den Code sehr verkürzt. – Matt
Lua Funktionen, wie alle Werte, haben keine Namen.Deshalb hat @lhf in seiner Antwort eine Zeichenfolge mit dem Funktionswert verknüpft. –