用字符串表示的 Lua 函数调用及其参数列表

在LUA中,能否像foo("param1,param2,param3,param4")这样执行一个函数,并将其识别为foo(param2,param2,param3,param4)?

为什么会想这样做? 我有一个场景,其中一个函数可以接收任意数量的参数,而它们不能作为列表发送(它在CoronaSDK中,因此我无法真正修改源代码,只能适应它)。因此,有时我必须发送3个参数,而有时我将发送100个。有没有任何方法可以实现这一点?

点赞
用户1721424
用户1721424

你可以使用任意数量的参数调用lua函数。如果函数需要更多的参数,那么它们将被设置为nil。如果函数需要的参数太少,发送的额外参数将被忽略。

例如:

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

f(1, 2) -- 输出:1 2 nil

f(1, 2, 3) -- 输出:1 2 3

f(1, 2, 3, 4, 5) -- 输出:1 2 3

编辑:

如果您必须从字符串中获取参数并且这些参数包括诸如表和函数之类的内容,则除了使用loadstring函数解析字符串外,几乎没有其他选择:

-- s包含了参数
s = '1,2,{1,2,3}'

-- f是您想要调用的函数
loadstring('f(' .. s .. ')')()  -- 输出:1  2  table: 0061D2E8

我不确定CoronaSDK,但是loadstring函数 tends to be a bit slow,因此如果可能,请尽量避免使用它。

2012-10-13 02:35:43
用户734069
用户734069

它们不能作为列表发送(这是在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
2012-10-13 04:02:55
用户1190388
用户1190388

我认为(也是我使用的)其中最好的方法是这样的:

function Call( ... )
    -- 所有传入的参数都存储在一个名为 arg 的默认表中
    table.foreach( arg, print )
end

这里有一个在codepad-oDmVZ209上运行的示例。

2012-10-13 04:20:01
用户1442917
用户1442917

我赞同 Nicol Bolas 的观点,你可能试图解决错误的问题。但如果你仍然想解析该字符串并将其转换为参数列表,下面是一种方法(在 Corona 环境中无法使用 loadstring;显然,这不能处理任何类型的分层数据):

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"))
2012-10-13 05:52:17