3

出于某种原因,如果 else 语句执行次数过多,下面的代码将引发堆栈溢出错误。我试图让 scene.targeting 函数从objTable传入的参数中选择一个目标,但只有带有 a 的目标.tgtFlag == false才是有效的选择。如果该函数选择一个具有 的目标.tgtFlag == true,它会调用在同一组参数中传递的 scene.targeting 函数。

中断的行是local theTarget = params.objTable[math.random( 1, #params.objTable )]但仅在else scene.targeting(params) end被调用几次之后。

任何帮助将不胜感激。

function scene.targeting( params ) -- Targeting functions

  function animateTarget( target )
    if target.savedFlag == false then
      transition.to( target, {time = 100, y = target.y - 15} )
      transition.to( target, {time = 100, delay = 150, y = target.y, onComplete = animateTarget}     )
    end
  end

  local theTarget = params.objTable[math.random( 1, #params.objTable )]
  if theTarget.tgtFlag == false then
    theTarget.tgtFlag = true
    animateTarget(theTarget)
  else
    scene.targeting(params)
  end
end
4

1 回答 1

4

参考Lua 编程

tail call 是一种打扮成呼叫的 goto。当一个函数调用另一个函数作为其最后一个操作时,就会发生尾调用,因此它没有其他事情可做。

在您的示例中,animateTarget显然不是以这种方式调用的,并且可能并且将会遭受堆栈溢出的影响。要么重写它以利用 TCO,要么将其更改为非递归版本。

于 2013-11-14T10:32:55.920 回答