loc = bot:getLoc()
items = bot:findItems(ShipType) -- Find a Ship
minDist = 999999
found = false
for indx, item in ipairs(items) do
local d = loc:distSquared(item:getLoc())
if(d < minDist) then
closestItem = item
minDist = d
end
end
if(closestItem != nil) then
firingAngle = getFiringSolution(closestItem)
end
在这个代码片段中,如果findItems()方法没有返回候选项,那么closestItem仍然会指向上次找到的船只,而在这段时间里,该船只可能已经被摧毁了。如果该船只已被摧毁,则它不再存在,getFiringSolution()方法将失败。
你发现问题了吗?我的用户也可能没有发现。虽然微妙,但效果却很显著。
一种解决方案是要求声明所有变量,并将所有变量默认为局部变量。虽然这种改变不能完全防止程序员引用不存在的对象,但可以更难以无意间这样做。
有没有办法告诉Lua将所有变量默认为局部变量,或者要求声明变量?我知道一些其他编程语言(比如Perl)有这个选项。
谢谢!
这里有很多好答案,谢谢! 我决定使用稍微修改过的Lua 'strict'模块。这似乎能让我达到想要的效果,并且我会对其进行一些修改,以便更适合我的特定环境。