【问题标题】:pcall with variable argument in lualua中带有可变参数的pcall
【发布时间】:2015-08-19 00:02:13
【问题描述】:

我正在寻找一种方法来 pcall lua5.3 中具有可变参数的函数。

我希望有这样的东西

function add(...)
local sum=arg + ...
return sum
end

stat,err=pcall(add,...)

谢谢

【问题讨论】:

  • add(...)定义为foldl1(function(x,y) return x+y end, {...})

标签: lua


【解决方案1】:
function add(...)
   local sum = 0
   for _, v in ipairs{...} do 
      sum = sum + v
   end
   return sum
end

pcall(add, 1, 2, 3)
-->   true    6

或者这可能更接近您想要的:

function add(acc, ...)
   if not ... then
      return acc
   else 
      return add(acc + ..., select(2, ...))
   end
end

pcall(add, 1, 2, 3)
-->   true    6

【讨论】:

  • 请注意,Lua 解析器接受的函数调用的参数数量是有限制的。例如:add(0,1,2,3,--[[enumerate other integers here]],241,242) 可能工作,而add(0,1,2,3,--[[enumerate other integers here]],241,242,243) 将发送错误错误:function or expression too complex near ')'. 此限制与 Lua VM 字节码中可访问上值的数量限制有关,并为系统调用在运行时保留.
  • 实际限制还取决于您使用的 Lua 版本或引擎(环境可能会设置下限,Lua 似乎只希望在函数调用中支持至少 50 个参数。那根据解释器的字节码实现,Lua 中的限制可能会发生变化,但 Lua 引擎可能不需要使用该字节码并将其 JIT 编译为没有此限制但可能在系统调用堆栈上有另一个限制的本机代码(如果这是分配upvalues的地方)或用户配额(或动态分配内存上的每个进程配额或每个线程配额)。
  • 另请注意,解决方案中对add() 的递归调用是一个尾随调用,因此Lua 将其编译为循环:它在通过加法减少2 个参数acc...[1] 后进行迭代acc+...,并使用select(2, ...)... 中的所有其他参数向左移动。循环最多迭代 242 次(由于函数调用中参数数量的限制)或更少(某些 Lua 版本或环境允许不超过 50 个参数,包括隐含的第一个参数 self 用于函数名称冒号前缀,例如object:name)
猜你喜欢
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2013-03-14
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多