使用全局“local”的Lua“require”?

很显然我有点混淆,但我认为通过在 "main.lua" 中使用这样的东西:

local module = require("module")
local var = "I should be global?"
printthis()

其中 module.lua 包含以下内容:

function printthis()
    print(var)
end

printthis(var) 应该工作正常,因为现在 module.lua 代码在 main.lua 中,对吗? 然而,printthis 不知道 var 是什么。我读过在可能的情况下使用 "local" 在 Lua 变量上是一种良好的做法,但在这种情况下,我必须将 var 设置为全局变量,还是 module.lua 的 printthis() 函数有一种方法来正确读取 var

原文链接 https://stackoverflow.com/questions/6586145

点赞
stackoverflow用户41761
stackoverflow用户41761

我不是 Lua 的专家,但是 var 不应该作为变量传递吗?类似这样的:

function printthis(var)
    print(var)
end

你在函数头中缺少了 var,并且你将在 main.lua 中的 var 作为参数传递给 printthis() 函数。

2011-07-05 16:56:42
stackoverflow用户298661
stackoverflow用户298661

不,这不是它的工作原理。

Lua 解释器提供了一个全局表,通常称为 _G,除非你在做一些奇怪的事情。

function printthis()
    print(var)
end

实际上,这意味着

_G.printthis = function()
    _G.print(_G.var);
end

并且你在主要代码中的代码等同于

local module = _G.require("module")
local var = "I should be global?"
_G.printthis()

但是当你调用 printthis 时,_G.var 在哪里设置了呢?没有设置。因此,该变量是 nil,就像访问表中没有该键的所有访问一样。

这可能很不方便,但从长远来看,通过传递参数而不是设置全局变量要好得多。一旦你来改变程序的任何内容,就完全不可能进行任何更改,因为逻辑没有结构,你不知道发生了什么,除非阅读每一行代码并立即理解它。此外,你只能在一个地方使用每个键,因为它是全局表。所以我希望没有人希望使用 "var" 作为变量名,并且你不介意你的代码默默地失败,因为你错误地使用了一个全局名称。

2011-07-05 17:26:34
stackoverflow用户573255
stackoverflow用户573255

另外两个答案忽略了一个重要的问题:词法作用域。

大致意思是,代码可以访问在定义代码的地方定义的局部变量。这可能听起来很模糊,所以我会举个例子:

local cheese = 'sandwich'
print(cheese) -- 输出sandwich
do -- 这开始了一个匿名块
    local cheese = 22
    print(cheese) -- 输出22
end
print(cheese) -- 输出sandwich

所以我们这里有两个不同的变量:外部的变量被内部的变量"遮盖"了。

现在,转到函数:

do
    local hotdog = 'hot'
    function nonsense()
        print(hotdog)
    end
end
print(hotdog) -- 输出nil,因为这里没有叫hotdog的变量
nonsense() -- 输出hot

函数可以从它们被_定义_的地方看到局部变量,而不是从它们被调用的地方。一旦你掌握了它,这非常重要而且非常有用。

2011-07-08 17:05:24