Function “卢阿”;要求;与全球;“本地”吗;?

Function “卢阿”;要求;与全球;“本地”吗;?,function,module,scope,lua,Function,Module,Scope,Lua,很明显,我有一些混淆,但我认为通过在“main.lua”中使用类似的内容: module.lua包含以下内容: function printthis() print(var) end printthis(var)可以正常工作,因为现在module.lua代码在main.lua中,不是吗?相反,printthis不知道什么是var。我了解到,在可能的情况下,对Lua变量使用“局部”是一种很好的做法,但在这种情况下,我是否必须将var设置为全局变量,或者是否有办法让module.Lua的p

很明显,我有一些混淆,但我认为通过在“main.lua”中使用类似的内容:

module.lua包含以下内容:

function printthis()
    print(var)
end

printthis(var)
可以正常工作,因为现在module.lua代码在main.lua中,不是吗?相反,printthis不知道什么是
var
。我了解到,在可能的情况下,对Lua变量使用“局部”是一种很好的做法,但在这种情况下,我是否必须将
var
设置为全局变量,或者是否有办法让module.Lua的
printthis()
函数正确读取
var

我不是lua方面的专家,但不应该将
var
作为变量传递。大概是这样的:

function printthis(var)
    print(var)
end

函数头中缺少
var
。您正在
main.lua
中将
var
作为参数传递给
printthis()
函数。

否。它根本不是这样工作的

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
-在哪里设置了
\u G.var
?没有。所以这个变量是nil,就像对表的所有其他访问一样,在这个键上没有任何内容


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

其他两个答案掩盖了一件重要的事情:词法范围

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

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

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

我很确定这会奏效,是的。但我当前的项目相当大,如果我从其他模块“需要”的所有函数都只读取我的“全局”局部变量,而不是手动为每个变量传递变量,那就更好了。此外,我正在使用的库中似乎有一些函数不允许我调用带有参数的函数。实践表明,大型项目和全局变量不是一个好的组合。也不是一个好的做法。)这被称为闭包。
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