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