我有一个原则上可以是任意长度的值表:
Points =
{
"Point #1",
"Point #5",
"Point #7",
"Point #10",
"Point #5",
"Point #11",
"Point #5",
}
我想将它们作为参数传递给函数。
addPath(<sPathName>, <sPoint>, <sPoint>, ...)
现在,通常你可以使用“调用”功能。但在我使用的软件中,此功能不可用,不在范围内。
如何在Lua 4中解决这个问题?
[编辑]
Here是我可以使用的功能。
答案 0 :(得分:4)
在较新版本的Lua中,您使用unpack
,与addPath(sPathName,unpack(Points))
一样,但Lua 4.0没有unpack
。
如果您可以添加C代码,Lua 5.0中的unpack
在4.0中可以正常工作:
static int luaB_unpack (lua_State *L) {
int n, i;
luaL_checktype(L, 1, LUA_TTABLE);
n = lua_getn(L, 1);
luaL_checkstack(L, n, "table too big to unpack");
for (i=1; i<=n; i++) /* push arg[1...n] */
lua_rawgeti(L, 1, i);
return n;
}
将其添加到lbaselib.c
,然后添加到base_funcs
:
{"unpack", luaB_unpack},
如果你不能添加C代码,那么你运气不好,可能会被解决这个问题:
function unpack(t)
return t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10]
end
根据需要扩展返回表达式,但最多只能达到200左右。我们希望addPath
忽略或停止在第一个nil
。
你也可以尝试这个,它在第一个零停止,但没有明确的限制(有递归限制,它只能处理多达250个表项):
function unpack(t,i)
i = i or 1
if t[i]~=nil then
return t[i],unpack(t,i+1)
end
end