1

我写了一些这样的lua代码:

local a1 = 1
local a2 = 2
local a3 = 3
local a4 = 3
local a5 = 3
local a6 = 3
local a7 = 3
local a8 = 3
local a9 = 3
local a10 = 3

local a11 = 3
local a12 = 3
local a13 = 3
local a14 = 3
local a15 = 3
local a16 = 3
local a17 = 3
local a18 = 3
local a19 = 3
local a20 = 3

local a21 = 3
local a22 = 3
local a23 = 3
local a24 = 3
local a25 = 3
local a26 = 3
local a27 = 3
local a28 = 3
local a29 = 3
local a30 = 3

local a31 = 1
local a32 = 2
local a33 = 3
local a34 = 3
local a35 = 3
local a36 = 3
local a37 = 3
local a38 = 3
local a39 = 3

local a40 = 3
local a41 = 3
local a42 = 3
local a43 = 3
local a44 = 3
local a45 = 3
local a46 = 3
local a47 = 3
local a48 = 3
local a49 = 3
local a50 = 3

local a61 = 3
local a62 = 3
local a63 = 3
local a64 = 3
local a65 = 3
local a66 = 3
local a67 = 3
local a68 = 3
local a69 = 3
local a70 = 3

local function fun1(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
    print('.......')
end

local function fun2()
    fun1(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
    fun1(a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
    fun1(a21, a22, a23, a24, a25, a26, a27, a28, a29, a30)
    fun1(a31, a32, a33, a34, a35, a36, a37, a38, a39, a40)
    fun1(a41, a42, a43, a44, a45, a46, a47, a48, a49, a50)
    fun1(a51, a52, a53, a54, a55, a56, a57, a58, a59, a60)
    fun1(a61, a62, a63, a64, a65, a66, a67, a68, a69, a70)
end

运行此代码时出现这样的错误:

    78: function at line 71 has more than 60 upvalues

我知道这种代码很难看,我可以使用其他方法(比如表格),但是这种代码可能是我的用户编写的。

有人可以为我解释一下,并告诉我如何避免这种情况吗?非常感谢。

4

2 回答 2

5

告诉我如何避免这种情况?

有个老笑话。一个人走进医生办公室说:“当我这样举起手臂时会很痛。” 医生说:“所以不要那样举起你的手臂。”

如果您的用户编写的 Lua 代码无法编译,那不是您可以修复的。这不再是非法的编译错误,例如:

if condition  --forgot the then
  return something
end

因此,如果您的代码要接受任意 Lua 脚本进行编译和执行,则它需要能够处理无法编译的 Lua 脚本。不管什么原因。

如果编译失败,请向用户报告错误并尽可能恢复。

于 2012-08-20T21:06:39.307 回答
2

最多 60 个上值,即关闭闭包的外部范围的值,是 Lua 内部限制之一。当然,您可以通过重新编译 Lua 本身来更改它,但我建议不要这样做。而是将您的值打包在某个表中,其布局由代码逻辑决定。在您的特定示例中,您确实应该使用:

local a = {}
a[1] = 1
a[2] = 2
a[3] = 3
a[4] = 3
a[5] = 3
-- etc...
于 2012-08-20T21:53:19.770 回答