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

我有一个函数,在其中声明了一个全局变量obs,在函数内赋了一些值。如果我想在另一个lua文件中访问它,就会出现错误:“尝试调用'obs'一个nil值”,我需要做什么才能访问它?

以下是它的虚拟代码

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

//B.lua
function Y()
for i=1, #obs do      //这一行出错
end
end
点赞
用户1208078
用户1208078

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

a.lua

function x()
    -- _G 是全局表,这将创建一个附加到全局表的变量'obs',并且赋值为 'some text value'
    _G.obs = "some text value"
end

b.lua

require "a"
function y()
     print(_G.obs); -- 调用时输出 'some text value'
end

x(); y();

把东西塞进全局表通常是一个可怕的想法,因为任何其他地方的脚本都有可能覆盖变量、将变量置空等。在我看来,更好的方法是让 your a.lua 在表中返回其功能,这样你就可以在需要的文件中捕捉它。这将允许你定义一个 getter 函数,以当前状态直接返回附加到你的 'a.lua' 功能的 'obs' 变量。

你可能希望做些类似这样的事情来实现更好的可移植性(这种方式也更清晰,这样哪些模块定义了哪些功能就更容易明确):

a.lua

local obs_
function x()
    obs_ = "some text value"
end

function get_obs()
    return obs_
end

return { x = x, obs = get_obs }

b.lua

local a = require "a"
function y()
    print(a.obs())
end

a.x()
y()

因为您提到无法使用 require,我将假设您正在使用其他框架,该框架使用某些其他函数来加载库/文件。在这种情况下,您可能必须将所有内容都填充到全局表中。可能像这样做:

a.lua

-- 这将把函数 a_x 和 a_get_obs() 附加到全局表中
local obs_
function _G.a_x()
    obs_ = "some text value"
end

function _G.a_get_obs()
    return obs_
end

b.lua

-- 忽略此 require,我假设您的框架具有我无法复制的其他方式加载 a.lua
require "a"

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

_G.a_x()
y()
2014-06-20 13:34:24
用户7140551
用户7140551

记住,在其他程序中(如Garry's 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的那一个是您正在使用的。

2016-12-16 11:37:27