【发布时间】:2016-06-17 01:19:31
【问题描述】:
我有一张这样的桌子
local ftable = {
getPinId = app.getPinId
}
ftable 被传递给另一个函数,该函数将其导出为 RPC 接口。 这可行,但现在我想将函数调用跟踪添加到日志文件中。
简单的方法是
local ftable = {
getPinId = function(...) print("getPinId") app.getPinId(...) end
}
但是,这不是特别好。 我想写一些类似的东西:
local trace = function(func, ...)
return function(...) print(func) func(...) end
end
local ftable = {
getPinId = trace(app.getPinId)
}
但这并不能产生理想的结果。参数没有被传递。
另一种选择是使用这样的元表:
local ftable = {}
setmetatable(ftable, {
__index = function(_, k)
printf("Call: app.%s\n", k) return app[k] end
})
哪个有效。但如果可能的话,我也希望能够打印传递的参数。
有什么建议吗? 如果这有什么不同,我将专门使用 luajit。
【问题讨论】:
-
你的代码应该可以工作,除了它会打印函数的地址,而不是它的名字。请展示您报告的失败示例。
-
是的,我尝试了 debug.getinfo 函数,但没有帮助。它把它当作一个匿名函数。我想我可以通过名字。现在我正在使用 metatable 方法,它大大缩短了代码。
-
Lua 函数和所有值一样,没有名称。这就是为什么@lhf 在他的答案中将字符串与函数值相关联。