【问题标题】:Lua - Why don't Global variables need declarations?Lua - 为什么全局变量不需要声明?
【发布时间】:2018-03-30 19:00:57
【问题描述】:

根据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

【问题讨论】:

  • 然后你会看到显示的值不正确,你必须找出你做错了什么,这是变量拼写错误。可以随时复制和粘贴变量。
  • @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


【解决方案1】:

因为 Lua 没有类。 self.MyGlobal 不是全局变量,它是通过self 参数传递的表中的字段。语法等同于self["MyGlobal"]。对于“真正的”全局变量赋值(例如x = 0),它等价于_G["x"] = 0,其中_G 是全局环境表。

由于 Lua 没有类的概念,self 的类型只是一个表。您用于指定“方法”的语法只是对此的一种语法快捷方式:

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

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

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

【讨论】:

  • 我不遵循逻辑。 C 没有类,但必须声明全局变量。 (其余信息还可以。)
  • @TomBlodget Lua 中的每个复合对象都是一个表,它具有不绑定到特定类的动态内容。由于问题是关于为什么不能声明表的字段,这就是我的解释。
  • 我现在看到了连接。您正在解释全局变量如何按照规范运行。我认为问题是考虑语言如何不同并且没有变量默认为全局范围。它可以很好地做到这一点,比如说,添加一个global 关键字。但如果这是一个问题,只有历史才能回答。罗伯托引用了here
猜你喜欢
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多