【发布时间】:2010-11-04 03:01:09
【问题描述】:
我是Bitfighter 的首席开发人员,我们使用 Lua 作为脚本语言,让玩家可以编写自己的自定义机器人飞船。
在 Lua 中,你不需要声明变量,所有变量默认为全局范围,除非另有声明。这会导致一些问题。以下面的sn-p为例:
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
在这个 sn-p 中,如果 findItems() 没有返回任何候选者,那么最近的Item 仍将引用它最后一次找到的任何船只,并且在此期间,该船只可能已经被杀死。如果这艘船被杀死,它就不再存在,getFiringSolution() 将失败。
你发现问题了吗?好吧,我的用户也不会。它很微妙,但具有戏剧性的效果。
一种解决方案是要求声明所有变量,并将所有变量默认为本地范围。虽然这种变化不会使程序员无法引用不再存在的对象,但它会使无意中这样做变得更加困难。
有没有办法告诉 Lua 将所有变量默认为本地范围,和/或要求它们被声明?我知道其他一些语言(例如 Perl)有这个选项可用。
谢谢!
这里有很多好的答案,谢谢!
我决定使用 Lua 'strict' 模块的略微修改版本。这似乎让我到达了我想去的地方,我会稍微改进一下以改进消息并使它们更适合我的特定环境。
【问题讨论】:
-
顺便说一句,您是否有充分的理由在 if 语句中添加额外的大括号?
-
好吧,在你提出这个问题之前,我会回答他们是必需的。但现在我必须回答,省略括号对我来说是错误的!
-
当然是个人喜好。但重要的是要记住 Lua 不是 C 或 Pascal 之类的。 Lua 就是 Lua,要有效地使用它,你必须按原样使用它,而不是让它成为其他编程语言的糟糕替代品。我发现这种“语法看起来错误”的事情确实有助于将 Lua 放入我的大脑中,这与 C++ 和我所知道的其他语言不同。总之,我的意见是:如果是用Lua写的,就用Lua的方式写吧! :-)
-
是的,你提出了一些好观点。 Lua 不是 C,但我认为某些 C 约定使代码更具可读性(至少对我而言:-)。我已经克服了早先使用分号结束行的习惯,并且在使用 C++ 和 Lua 时,我确实尝试让我的格式样式有点不同。但我可能会在条件子句中坚持使用括号一段时间。
-
所以,Alex,如果我理解你的话,如果 Lua 允许多种方式来编写某些东西,那么与其他语言形式不相似的方式将优于与其他语言形式相似的方式?如果是这样,那么我们必须努力编写对非 Lua 编码人员尽可能不透明的 Lua 代码。