2013-10-04 25 views
4

我有值的表,可以在原則上是任意長度:傳遞表值在Lua 4函數參數沒有「呼叫」功能

Points = 
{ 
    "Point #1", 
    "Point #5", 
    "Point #7", 
    "Point #10", 
    "Point #5", 
    "Point #11", 
    "Point #5", 
} 

我想將它們作爲參數傳遞給函數。

addPath(<sPathName>, <sPoint>, <sPoint>, ...) 

現在,通常您可以使用「呼叫」功能。但是在我使用的這個函數中,這個函數不可用,也不在範圍之內。

如何在Lua 4中解決這個問題?

[編輯]

Here是函數餘可以使用。

回答

4

在較新版本的Lua中,您會使用unpack,如addPath(sPathName,unpack(Points)),但Lua 4.0沒有unpack

如果你可以從Lua 5.0新增的C代碼,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 
+0

我如何再將它們傳遞給函數? – posfan12

+0

我無法添加C代碼。將嘗試你的其他建議。 – posfan12