是否可以在 LUA 中执行类似 foo("param1, param2, param3, param4") 的函数,并将其检测为 foo(param2, param2, param3, param4)
为什么?我有一个场景,一个函数可以接收任意数量的参数,但它们不能作为列表发送(它在 CoronaSDK 中,所以我不能真正修改源,必须适应它)。所以,有时我必须发送 3 个参数,而有时我会发送 100 个。有这样做的吗?
它们不能作为列表发送(它在 CoronaSDK 中,所以我不能真正修改源,必须适应它)
当然可以。手表:
function CallWithParametersInAList(FunctionToCall, paramsInList)
return FunctionToCall(unpack(paramsInList))
end
看?中的每个数组元素都paramsInList
将被解压缩为FunctionToCall
. 此外,FunctionToCall
将返回来自的每个返回值。
看
function test(a)
print("this is lua test function."..a);
end
CallWithParametersInAList(test,{33333});
输出
this is lua test function.33333
您可以根据需要调用具有任意多个参数的 lua 函数。如果函数需要更多参数,它们将被设置为 nil。如果函数需要的参数太少,发送的额外参数将被忽略。
例如:
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 函数往往有点慢。如果可能,尽量避免它。
我想告诉 Nicol Bolas,您可能正在尝试解决错误的问题,但是如果您仍想解析字符串并将其转换为参数列表,这是一种方法(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"))
在我看来(也是我使用的)最好的方法之一是这样的:
function Call( ... )
-- All passed arguments are stored in a default table named arg
table.foreach( arg, print )
end
而且,这是一个关于键盘的工作示例- oDmVZ209。