xxx行的函数有超过60个upvalues

时间:2012-08-20 20:59:49

标签: lua

我写了一些像这样的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

我知道这种代码是丑陋的,我可以使用其他方式来做它(比如表格),但这种代码可能是由我的用户编写的。

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

2 个答案:

答案 0 :(得分:6)

  

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

有个老笑话。一个男人走进医生的办公室说:“当我举起这样的手臂时疼得厉害。”医生说:“所以不要那样抬起你的手臂。”

如果您的用户编写了无法编译的Lua代码,那么您无法修复。这不是一个非法的编译错误,而不是像:

if condition  --forgot the then
  return something
end

因此,如果您的代码将接受任意Lua脚本进行编译和执行,那么需要能够处理无法编译的Lua脚本。对于无论什么原因。

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

答案 1 :(得分:3)

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

local a = {}
a[1] = 1
a[2] = 2
a[3] = 3
a[4] = 3
a[5] = 3
-- etc...