显然我有些混淆,但我想通过在“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}}正确吗?
答案 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()
函数。