2012-10-13 79 views
3

LUA中可能執行像foo(「param1,param2,param3,param4」)這樣的函數,並將其檢測爲foo(param2,param2,param3,param4 )帶參數列表的字符串中的Lua函數調用

爲什麼? 我有一個場景,其中一個函數可以接收儘可能多的參數,並且它們不能作爲列表發送(它在CoronaSDK中,所以我不能真正修改源代碼,並且必須適應它)。所以,有時我需要發送3個參數,有時我會發送100個。有沒有這樣做?

回答

2

您可以根據需要調用具有多個參數的lua函數。如果函數需要更多參數,它們將被設置爲零。如果函數期望的參數太少,則發送的額外參數將被忽略。

例如:

function f(a, b, c) 
    print(a, b, c) 
end 

f(1, 2) -- prints: 1 2 nil 

f(1, 2, 3) -- prints: 1 2 3 

f(1, 2, 3, 4, 5) -- prints: 1 2 3 

編輯:

如果你必須從一個字符串參數,這些參數包括像表和函數,你別無選擇,只能得到字符串被解析loadstring函數:

-- s contains the parameters 
s = '1,2,{1,2,3}' 

-- f is the function you want to call 
loadstring('f(' .. s .. ')')() -- prints: 1 2 table: 0061D2E8 

我不確定CoronaSDK,但loadstring函數往往有點慢。儘可能避免它。

+0

OP想要將*字符串*轉換爲參數列表。 – lhf

+1

@lhf:這是一個XY問題;他試圖用錯誤的方式解決實際問題(用任意參數調用一個函數)。 –

2

他們不能被作爲一個列表(它在CoronaSDK,所以我真的不能修改源,並有去適應它)

當然可以。手錶:

function CallWithParametersInAList(FunctionToCall, paramsInList) 
    return FunctionToCall(unpack(paramsInList)) 
end 

請參閱? paramsInList中的每個數組元素都將被解壓到FunctionToCall的參數中。此外,將返回FunctionToCall的每個返回值。

0

其中一個最好的方法,我認爲(和我使用的一個)是這樣的:

function Call(...) 
    -- All passed arguments are stored in a default table named arg 
    table.foreach(arg, print) 
end 

而且,這裏的一對codepad工作的例子 - oDmVZ209

+3

這是Lua 5.0語法,在Lua 5.1中棄用並在Lua 5.2中刪除(都涉及'arg' table'table.foreach'函數)。 – prapin

0

我想第二個尼科爾布拉斯,你可能試圖解決錯誤的問題,但如果你仍然想解析字符串,並將其變成一個參數列表,這裏有一種方法可以做到這一點(loadstring不是在Corona環境中可用;顯然這不能處理任何類型的分層數據):

function str2list(s) 
    local parms = {} 
    for p in s:gmatch("([^,]+),?") do table.insert(parms, p) end 
    return unpack(parms) 
end 
print(str2list("param1, param2, param3, param4")) 
相關問題