Lua - 为什么不要全局变量需要声明?

时间:2018-03-30 09:46:59

标签: lua

根据Lua's manual

  

全局变量不需要声明。您只需为全局变量赋值即可创建它。访问非初始化变量不是错误;你得到特殊值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

1 个答案:

答案 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,每次检查赋值时,如果它分配给您实际“声明”的字段。