当前位置 : 主页 > 网络编程 > lua >

为Lua声明变量和范围问题

来源:互联网 收集:自由互联 发布时间:2021-06-23
我是 Bitfighter的首席开发者,我们使用Lua作为脚本语言,允许玩家编写自己的定制机器人船. 在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,但我建议’严格’.

网友评论