【发布时间】:2018-03-30 19:00:57
【问题描述】:
全局变量不需要声明。您只需为全局变量赋值即可创建它。访问未初始化的变量不是错误;你只是得到特殊值 nil 作为结果
我认为声明很好,它使事情更易于管理。为什么 Lua 跳过全局变量的声明?我想他们有充分的理由,但我不知道为什么。
如果我犯了这个错误怎么办
-- Activation Code
function TestLoco:OnActivate()
self.MyGlobal = "ABC"; --Init the global variable
end
-- Run every tick
function TestLoco:OnTick()
self.MyGIobaI = "BCD"; --Edit the global variable at every tick, but I mistake 'I' with 'l'
end
-- Call when I click the mouse
function TestLoco:OnClick()
Debug.Log(self.MyGlobal); --This print "ABC", but It should be "BCD", what if I don't notice this?
end
【问题讨论】:
-
然后你会看到显示的值不正确,你必须找出你做错了什么,这是变量拼写错误。可以随时复制和粘贴变量。
-
@Rimble:感谢您的评论,这只是一个说明我的观点的示例,我正在考虑更复杂的脚本,该错误隐藏在代码的深处,并且只能在以下情况下检测到非常特殊的条件匹配。所以你的意思是当我们写 Lua 的时候,我们只能依靠我们的人眼——这是非常骗人的(我不相信自己)
-
1) Lua 中全局变量的使用...有点弃用了。 2)
strict.lua是Lua编程的必备。我总是用它。 3)您可以创建基于元方法的实用程序来定义表中允许的字段。 -
感谢 Egor Skriptunoff :)
-
Lua 中确实没有全局变量这样的东西。它更多的是关于范围界定。 lua 中的一切都是表,您可以设置环境,这实际上只是更改在 index 和 newindex 上操作哪个表。默认环境只是表_G._G。如果您在加载字符串上使用 setfenv 和新表,您将看到它无法访问 _G 中的任何内容,除非您专门设置元方法以查看那里。默认情况下,当您执行 foo = bar 时,实际上就像您编写了 _G.foo = bar。如果 setfenv 设置为 sometable,那么当您执行 foo = bar 时,它实际上就是 sometable.foo = bar。
标签: lua