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の内部制限の1つです。もちろん、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 に答える