代码之家  ›  专栏  ›  技术社区  ›  123iamking

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

lua
  •  1
  • 123iamking  · 技术社区  · 8 年前

    根据 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 回复  |  直到 8 年前
        1
  •  1
  •   IS4    8 年前

    因为Lua没有课程。 self.MyGlobal 不是全局变量,而是通过 self 参数语法等效于 self["MyGlobal"] 。对于“真实”全局变量赋值(例如。 x = 0 ),相当于 _G["x"] = 0 哪里 _G 是全局环境表。

    由于Lua没有类的概念 自己 只是一张桌子。您用于指定“方法”的语法只是一个语法快捷方式:

    TestLoco.OnActivate = function(self)
        self["MyGlobal"] = "ABC";
    end
    

    它只是一个在表中分配字段的函数。它可能会被任何表调用,因此它实际上无法验证该表 应该 拥有那个领域。

    然而,Lua通过元表提供了一些非常好的运行时可定制检查。如果您构建一个指定表的“类”的表,那么您可以将一个元表分配给每次检查分配的每个表,如果它分配给您实际“声明”的字段。