在LUA中在函数内部声明全局变量
2014-6-20 12:51:20
收藏:0
阅读:193
评论:2
我有一个函数,在其中声明了一个全局变量obs,在函数内赋了一些值。如果我想在另一个lua文件中访问它,就会出现错误:“尝试调用'obs'一个nil值”,我需要做什么才能访问它?
以下是它的虚拟代码
//A.lua
function X()
obs = splitText(lk,MAXLEN)
end
//B.lua
function Y()
for i=1, #obs do //这一行出错
end
end
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
有几种方法可以做到这点。使用当前的设置,你可以这样做:
a.lua
function x() -- _G 是全局表,这将创建一个附加到全局表的变量'obs',并且赋值为 'some text value' _G.obs = "some text value" endb.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_ endb.lua
-- 忽略此 require,我假设您的框架具有我无法复制的其他方式加载 a.lua require "a" function y() print(_G.a_get_obs()) end _G.a_x() y()