Lua函数调用,字符串中的参数列表

问题描述 投票:3回答:4

在LUA中是否可以执行类似foo(“ param1,param2,param3,param4”)的功能,并将其检测为foo(param2,param2,param3,param4)

为什么?我遇到的情况是,一个函数可以接收所需数量的参数,而不能将它们作为列表发送(它在CoronaSDK中,因此我不能真正修改源代码,而必须适应它)。因此,有时我必须发送3个参数,而有时我将发送100个参数。无论如何,这样做吗?

dynamic lua corona
4个回答
3
投票

它们不能作为列表发送(它在CoronaSDK中,所以我不能真正修改源代码,而必须适应它)

当然可以。观看:

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

看到了吗? paramsInList中的每个数组元素都将解压缩为FunctionToCall的参数。同样,将返回FunctionToCall中的每个返回值。

see

function test(a)
    print("this is lua test function."..a);
end

CallWithParametersInAList(test,{33333});

输出

this is lua test function.33333

2
投票

您可以使用任意数量的参数调用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函数往往会比较慢。如果可能,请尽量避免。


0
投票

我认为(和我使用的最好的方法之一是这样的:

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

而且,这是codepad-oDmVZ209上的有效示例。


0
投票

我第二次是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"))
© www.soinside.com 2019 - 2024. All rights reserved.