lua - 为 Lua 声明变量和范围问题

标签 lua scope

我是 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/

相关文章:

javascript - 如何在一个 Javascript 文件中授予对另一个文件中定义的变量的访问权限

java - 从 Luaj 运行 Java 方法, "index expected, got string"

lua - next() 是否寻找 __pairs 元方法?

c++ - 关于范围的最佳变量声明

javascript - 在JS中将函数作为参数传递并访问接收函数的变量

javascript - 为什么我的变量不起作用,但定义却起作用?

python - For循环不保存循环外的变量

string.find 搜索 "."时不返回 nil

Lua - 在元表中只调用一个运算符

Lua模式匹配问题