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