Lua“要求”全球“本地”?

时间:2011-07-05 16:54:36

标签: function module scope lua

显然我有些混淆,但我想通过在“main.lua”中使用类似的东西:

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

with module.lua包含以下内容:

function printthis()
    print(var)
end

printthis(var)可以正常工作,因为现在module.lua代码 main.lua里面,不是吗?相反,printthis不知道var是什么。我认为在可能的情况下在Lua变量上使用“local”是一个好习惯,但是在这种情况下,我是否必须使var全局或者有一种方法可以让module.lua的printthis()函数读取{ {1}}正确吗?

3 个答案:

答案 0 :(得分:23)

没有。这根本不是它的运作方式。

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

function printthis()
    print(var)
end

这实际上转化为

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

您在main中的代码等于

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

但是当你致电printthis时 - _G.var的确定位置?无处。所以变量是nil,就像对该表没有任何内容的所有其他访问一样。

这可能不方便,但从长远来看,传递参数比设置全局变量更好。 更好。一旦你改变了程序的任何内容,就完全不可能做出任何改变,因为逻辑没有结构,你不知道在没有阅读每一行代码并立即理解它的情况下会发生什么。另外,你只能在一个地方使用每个键,因为它是一个全局表 - 所以我当然希望没有其他人想要使用“var”作为变量名,你不介意你的代码默默地失败,因为你有一个全局名字错了。

答案 1 :(得分:4)

另外两个答案掩盖了一个重要的事情:词汇范围。

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

local cheese = 'sandwich'
print(cheese) -- prints sandwich
do -- this begins an anonymous block
    local cheese = 22
    print(cheese) -- prints 22
end
print(cheese) -- prints sandwich

所以我们这里有两个不同的变量:外部变量被内部“遮蔽”。

现在,进入功能:

do
    local hotdog = 'hot'
    function nonsense()
        print(hotdog)
    end
end
print(hotdog) -- prints nil, since there is no variable called hotdog here
nonsense() -- prints hot

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

答案 2 :(得分:1)

我不是lua的专家,但不应该var作为变量传递。像这样:

function printthis(var)
    print(var)
end

您在功能标题中缺少var。并且您将var main.lua作为参数传递给printthis()函数。