在LUA中的函数内声明全局变量

在LUA中的函数内声明全局变量,lua,Lua,我有一个函数,在函数中声明了一个全局变量obs,并分配了一些值。如果我想在其他lua文件中访问它,它会给出一个错误:“尝试调用obs一个nil值,我需要做什么才能访问它 这是它的伪代码 //A.lua function X() obs = splitText(lk,MAXLEN) end //B.lua function Y() for i=1, #obs do //error at this line end end 有几种方法可以做到这一点。使用当前设置,您可以做到: a、 卢

我有一个函数,在函数中声明了一个全局变量
obs
,并分配了一些值。如果我想在其他lua文件中访问它,它会给出一个错误:“尝试调用
obs
一个nil值,我需要做什么才能访问它

这是它的伪代码

//A.lua
function X()
obs = splitText(lk,MAXLEN)
end

//B.lua
function Y()
for i=1, #obs do      //error at this line
end
end

有几种方法可以做到这一点。使用当前设置,您可以做到:

a、 卢阿

b、 卢阿

但是,在全局表中填充内容通常是一个糟糕的主意,因为任何其他地方的脚本都可能会覆盖值、消除变量等。imo更好的方法是让a.lua在表中返回其功能,您可以在需要它的文件中捕获它。这将允许您定义getter函数n返回直接连接到“a.lua”功能的当前状态的“obs”变量

为了更好的可移植性,您可能希望执行类似的操作(也可以更清楚地看到哪些模块以这种方式定义了哪些功能):

a、 卢阿

b、 卢阿

既然您提到您不能使用require,我假设您正在使用其他函数加载库/文件的其他框架中工作。在这种情况下,您可能需要将所有内容填充到全局表中。可能类似于以下内容:

a、 卢阿

b、 卢阿


请记住,其他程序(Garry的Mod、魔兽世界、Vera、Domoticz)中的一些Lua程序使用_ENV而不是_G来限制其范围。因此全局变量必须是:

_ENV.variable = 1
而不是:

_G.variable = 1
之所以会发生这种情况,是因为开发人员希望限制标准Lua库,以避免用户访问诸如:os.exit()之类的方法

要查看是否使用了_ENV而不是_G,请将其打印出来,如果它返回一个表而不是nil,则最有可能使用它。您还可以使用以下代码段进行测试:

print(getfenv(1) == _G)
print(getfenv(1) == _ENV)

其中,要打印true的是您正在使用的。

如果在调用a.lua.的B.lua之上有一个require语句,则必须工作,并且确保在调用函数Y()之前调用函数X().噢,可能是splitText提供了nilOh,不,不。splitText根本没有提供NIL。实际上,有没有其他方法来存储值?我只是不能为A.lua做require语句(我在这里无法解释)但这在我的代码中是不可能的。我只需要找到一种方法将这个值存储在某个可以在B中访问的地方。luaIt很难理解你的设计。根据你的设计,你有不同的选择。你可以直接从B中调用X或在Y中调用X。也许最好在X中返回obs,这样你就可以在Y中调用X并使用返回值。您还可以将函数X作为参数传递给函数Y。您也可以编写一个文件,在其中存储obs并在B中读取,但我认为这将是最糟糕的方式:)问题是出于某种原因,我不能要求“a”“在Topah nevermind,我看到了你上面的评论。我将更新一个答案,将所有内容都粘贴到全局表中,因为这可能是您唯一的选择,如果您正在使用的任何东西都以其他方式加载lua文件。
local a = require "a"
function y()
    print(a.obs())
end


a.x()
y()
-- this will attach functions a_x and a_get_obs() to the global table
local obs_
function _G.a_x()
    obs_ = "some text value"
end

function _G.a_get_obs()
    return obs_
end
-- ignore this require, i'm assuming your framework has some other way loading
-- a.lua that i can't replicate
require "a"

function y()
    print(_G.a_get_obs())
end


_G.a_x()
y()
_ENV.variable = 1
_G.variable = 1
print(getfenv(1) == _G)
print(getfenv(1) == _ENV)