我正在尝试使用其名称来调用对象的函数(我想使用该名称,因为我将从URL中检索函数的名称)。
我是LUA的初学者,所以我试着了解什么是可能的(或不是!)
在这个例子中,我想执行函数" creerCompte()"对象" controllerUser"来自我的主文件。
我创建了一个主文件:
--We create the controller object
local controller = require("controllers/ControllerUser"):new()
local stringAction = "creerCompte" -- Name of the function to call in the controller Object
--Attempting to call the function stringAction of the object controller
local action = controller:execute(stringAction)
这是控制器对象
ControllerUser = {}
ControllerUser.__index = ControllerUser
function ControllerUser:new()
local o = {}
setmetatable(o, self)
return o
end
function ControllerUser:execute(functionName)
loadstring("self:" .. functionName .. "()") --Doesn't work: nothing happens
getfenv()["self:" .. functionName .. "()"]() --Doesn't work: attempt to call a nil value
_G[functionName]() --Doesn't work: attempt to call a nil value
self:functionName() -- Error: attempt to call method 'functionName' (a nil value)
end
function ControllerUser:creerCompte()
ngx.say("Executed!") --Display the message in the web browser
end
return ControllerUser
提前感谢您提供任何帮助
答案 0 :(得分:10)
尝试使用self[functionName](self)
代替self:functionName()
。
self:method()
是self.method(self)
的快捷方式,而self.method
是self['method']
的语法糖。
答案 1 :(得分:4)
在Lua中,函数没有名字。您用作名称的是变量的名称或表中的键(通常是全局变量表)
如果它是全局变量,如果您在_G['name'](args...)
变量中有名称,则当然可以使用_G[namevar](args...)
或namevar
。但是这很容易在很多方面中断(不适用于本地函数,或模块内的函数等)。
更好(更安全)的是创建一个只包含您想要提供的功能的表,并使用您想要用作表的键的名称:
local function doOneThing(args)
-- anything here
end
local function someOtherThingToDo()
-- ....
end
exportFuncs = {
thing_one = doOneThing,
someOtherThingToDo = someOtherThingToDo,
}
然后,您可以从名称exportFuncs[namevar](...)