在没有“调用”函数的 Lua 4 中将表值作为函数参数传递
Posted
技术标签:
【中文标题】在没有“调用”函数的 Lua 4 中将表值作为函数参数传递【英文标题】:Passing table values as function arguments in Lua 4 without the "call" function 【发布时间】:2013-10-10 21:23:15 【问题描述】:我有一个原则上可以是任意长度的值表:
Points =
"Point #1",
"Point #5",
"Point #7",
"Point #10",
"Point #5",
"Point #11",
"Point #5",
我想将它们作为参数传递给函数。
addPath(<sPathName>, <sPoint>, <sPoint>, ...)
现在,通常您可以使用“呼叫”功能。但是在我使用的软件中这个功能是不可用的,不在范围内。
如何在 Lua 4 中解决这个问题?
[编辑]
Here 是我可以使用的函数。
【问题讨论】:
【参考方案1】:在较新版本的 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 代码,那么你很不走运,可能会沦为这种 hack:
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
。
你也可以试试这个,它在第一个 nil 处停止,但没有明确的限制(有递归限制,它最多只能处理 250 个表条目):
function unpack(t,i)
i = i or 1
if t[i]~=nil then
return t[i],unpack(t,i+1)
end
end
【讨论】:
我如何将它们传递给函数?以上是关于在没有“调用”函数的 Lua 4 中将表值作为函数参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中将拆分函数转换为内联表值 udf?