LUA:在类中使用其名称(字符串)调用函数

时间:2014-09-25 15:39:18

标签: function oop lua

我正在尝试使用其名称来调用对象的函数(我想使用该名称,因为我将从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

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:10)

尝试使用self[functionName](self)代替self:functionName()

self:method()self.method(self)的快捷方式,而self.methodself['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](...)

轻松调用该函数