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

我想通过对象名称调用其函数(我想使用名称,因为我将从URL检索函数名称)。

我是LUA的初学者,因此我尝试了解什么是可能的(或不可能的!)

在此示例中,我想从我的主文件执行对象“controllerUser”的函数“creerCompte()”。

我创建了一个主文件:

    -我们创建控制器对象
   local controller = require(“controllers / ControllerUser”):new()
   local stringAction =“creerCompte”-要在控制器对象中调用的函数的名称

   -尝试调用对象控制器的函数stringAction
   local action = controller:execute(stringAction)

这是控制器对象

ControllerUser = {}
ControllerUser.__index = ControllerUser

function ControllerUser:new()
    local o = {}
    setmetatable(o,self)
    返回o
end

function ControllerUser:execute(functionName)
    loadstring(“self:”.. functionName ..“()”) - 不起作用:什么也没有发生
    getfenv()[“self:”.. functionName ..“()”]() - 不起作用:尝试调用空值
    _G [functionName]() - 不起作用:尝试调用空值
    self:functionName() - 错误:尝试调用方法'functionName'(一个空值)
end

function ControllerUser:creerCompte()
    ngx.say(“已执行!”) - 在Web浏览器中显示消息
end

返回ControllerUser

提前感谢任何帮助

点赞
用户1442917
用户1442917

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

self:method()self.method(self) 的快捷方式,而 self.methodself['method'] 的语法糖。

2014-09-25 15:53:53
用户11649
用户11649

Lua 中函数没有名字。你用作函数名的要么是一个变量名,要么是一个表中的键(通常是全局变量表)。

如果是全局变量,你可以使用_G['name'](args...)或者如果你的名字存储在namevar变量中,你可以使用_G[namevar](args...)。但是它容易出现许多问题(无法使用在本地函数或模块内的函数等)。

更好(也更安全)的方法是创建一个包含你想要公开函数的表,用你想要作为表键名的名称来命名:

local function doOneThing(args)
    -- 此处可传入任何内容
end

local function someOtherThingToDo()
    -- ....
end

exportFuncs = {
    thing_one = doOneThing,
    someOtherThingToDo = someOtherThingToDo,
}

然后,你可以通过名称轻松调用函数:exportFuncs[namevar](...)

2014-09-25 15:54:10