全局变量不需要声明。您只需为全局变量赋值即可创建它。访问非初始化变量不是错误;你得到特殊值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
答案 0 :(得分:1)
因为Lua没有课程。 self.MyGlobal
不是全局变量,它是通过self
参数传递的表中的字段。语法等同于self["MyGlobal"]
。对于“真正的”全局变量赋值(例如x = 0
),它等同于_G["x"] = 0
,其中_G
是全局环境表。
由于Lua没有类的概念,self
的类型只是一个表。用于指定“方法”的语法只是语法的快捷方式:
TestLoco.OnActivate = function(self)
self["MyGlobal"] = "ABC";
end
它只是一个在表中指定字段的函数。可以使用任何表调用它,因此它无法验证实际上应该具有该字段的表。
但是,Lua通过metatable提供了一些非常好的运行时可自定义检查。如果构建一个指定表的“类”的表,则可以为每个表分配一个metatable,每次检查赋值时,如果它分配给您实际“声明”的字段。