由于某种原因,如果else语句被执行了太多次,下面的代码会抛出堆栈溢出错误。我正在尝试使用scene.targeting函数从参数中传递的objTable
中选择一个目标,但只有.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
答案 0 :(得分:4)
尾部呼叫是一种打扮成呼叫的goto。当一个函数将另一个函数作为最后一个动作调用时,会发生尾调用,因此它没有其他任何操作。
在您的示例中,animateTarget
显然不会以这种方式调用,并且可能并且将遭受堆栈溢出。要么重写它以使用TCO,要么将其更改为非递归版本。