在表中放置函数时遇到问题。“新函数附近缺少括号。”

我在名为“hframe.lua”的文件中有这段代码。

table.insert(handler.class, framename)
local func = [[
function new(())
print("Hello Stackoverflow!")
end
]] --函数测试本身。
local a="table.insert(handler.class."..framename..", "..func..")" --我将它分为两部分,以便我更容易阅读。
print(a) --读出变量,以便我可以看到它的样子。
local b=load(a) --将其加载
b() --空值错误。太好了。

“framename”是来自另一个文件的常量,简单地被声明为“frame”。这个错误是一个简单的空值错误。在运行b()时,它抛出一个本地空值错误。通过一个断言,我已经发现了这个错误。

错误:线程错误(线程:0x04c7d2f0)

uicode/hframe.lua:16: [string "table.insert(handler.class.frame, function ne..."]:1: '(' expected near 'new'
stack traceback:
        [C]:在函数'assert'中
        uicode/hframe.lua:16:在主块中
        [C]:在函数'require'中
        uicode/handlerthread.lua:165:在主块中
stack traceback:
        [string "boot.lua"]:777: 在函数中 <[string“boot.lua”]:773>
        [C]:在函数'error'中
        [string“boot.lua”]:631:在函数中 <[string“boot.lua”]:630>
        [string“boot.lua”]:604:在函数中 <[string“boot.lua”]:594>
        [C]:在函数'xpcall'

我不完全确定为什么会抛出这个错误,因为我明确定义了它为函数new()。我做错了什么?

原文链接 https://stackoverflow.com/questions/70763765

点赞
stackoverflow用户4433969
stackoverflow用户4433969

Lua的load()函数在编译代码失败时返回nil和出现的错误。由于传递的代码是无效的,因此bnil。因此,当您尝试调用它时会引发错误。

代码无效的原因是因为当函数声明用作表达式时,必须省略函数名称,例如:

table.insert(sometable, function() … end)

请注意,您大多数情况下不需要动态创建代码,以下代码将有效:

table.insert(handler.class\[framename\], function() … end)

2022-01-19 00:43:52
stackoverflow用户2858170
stackoverflow用户2858170
`function new() end` 

是 `new = function () end` 的语法糖。

这是一种赋值方式,它没有返回值。因此,在需要使用值的地方,您无法使用函数定义。

在您的情况下,执行的代码是

table.insert(handler.class.someFrameName, function new () print("Hello Stackoverflow!") end )


对于 Lua 中给定表达式列表中出现的 `function` 关键字,唯一有意义的是匿名函数,并且它期望在 `function` 后面跟着 `(`,但却找到了 `new`。

您有两个选项来解决这个问题。

如果 `function new() end` 等价于 `new = function () end`,那么 `function () end` 必须解析为函数值。因此,我们可以在原地创建函数值:

table.insert(handler.class.someFrameName, function () print("Hello Stackoverflow!") end )


我将让您自己在要加载的字符串中实现此功能。

另一个选项是先定义函数。您可以在字符串或 `load` 调用的作用域中完成这个操作。

function new() print("Hello Stackoverflow") table.insert(handler.class.someFrameName, new)


2022-01-19 10:59:50