我是 Bitfighter 的首席开发人员,并且我们使用 Lua 作为脚本语言,让玩家可以编写自己的自定义机器人飞船。
在 Lua 中,您不需要声明变量,所有变量默认为全局范围,除非另有声明。这会导致一些问题。以下面的代码片段为例:
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() 没有返回任何候选者,那么最近的Item 仍然会引用它最后一次找到的任何船,并且在中间的时间里,那艘船可能已经被杀死了。如果这艘船被杀死,它就不再存在,getFiringSolution() 将失败。
你发现问题了吗?好吧,我的用户也不会。这是微妙的,但具有戏剧性的效果。
一种解决方案是要求声明所有变量,并将所有变量默认为本地范围。虽然这种变化不会使程序员无法引用不再存在的对象,但它会使无意中这样做变得更加困难。
有没有办法告诉 Lua 将所有变量默认为本地范围,和/或要求声明它们?我知道其他一些语言(例如 Perl)有这个选项可用。
谢谢!
这里有很多好的答案,谢谢!
我决定使用 Lua 'strict' 模块的略微修改版本。这似乎让我到达了我想去的地方,我会稍微改进一下以改进消息并使它们更适合我的特定环境。
最佳答案
没有设置此行为的选项,但标准安装提供了一个“严格”模块,它正是这样做的(通过修改元表)。
用法:
要求“严格”
如需更深入的信息和其他解决方案:http://lua-users.org/wiki/DetectingUndefinedVariables ,但我建议“严格”。
关于lua - 为 Lua 声明变量和范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1014757/