努力将函数放入 table。 "Missing '(' near new."

Struggling to put function into table. "Missing '(' near new."

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

table.insert(handler.class, framename)
local func = [[
function new(())
print("Hello Whosebug!")
end
]] --The function test itself.
local a="table.insert(handler.class."..framename..", "..func..")" --I broke it in two to make things easier for me to read.
print(a) --Read out the variable so I can see what it looks like.
local b=load(a) --Load it up
b() --Nil error. Great.

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

Error: Thread error (Thread: 0x04c7d2f0)

uicode/hframe.lua:16: [string "table.insert(handler.class.frame, function ne..."]:1: '(' expected near 'new'
stack traceback:
        [C]: in function 'assert'
        uicode/hframe.lua:16: in main chunk
        [C]: in function 'require'
        uicode/handlerthread.lua:165: in main chunk
stack traceback:
        [string "boot.lua"]:777: in function <[string "boot.lua"]:773>
        [C]: in function 'error'
        [string "boot.lua"]:631: in function <[string "boot.lua"]:630>
        [string "boot.lua"]:604: in function <[string "boot.lua"]:594>
        [C]: in function 'xpcall'

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

Lua load() 函数 returns nil 和编译代码失败时的错误。由于传递的代码无效,因此 b 为零。因此,当您尝试调用它时会引发错误。

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

table.insert(某个表,函数()...结束)

请注意,您很可能不需要动态创建代码,以下内容将起作用:

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

function new() end

的语法糖
new = function () end

这是一项作业。它不解析为一个值。因此,您不能在需要值的地方使用函数定义。

在你的例子中,执行的代码是

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

对于表达式列表中存在函数关键字的 Lua 唯一有意义的是匿名函数,它期望 function 之后的 ( 但发现 new

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

如果 function new() end 等同于 new = function () endfunction () end 必须解析为函数值。所以我们可以就地创建一个函数值:

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

我会留给你在你想要加载的字符串中实现它。

另一种选择是先定义函数。您可以在字符串中或 load 调用的范围内执行此操作。

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