从文件中获取变量
假设我有一个名为"test.lua"的文件,内容如下:
myVar = 5
Food = function()
end
如果我通过loadfile或者Lua API(在C ++或其他语言中)加载并运行文件,变量将会被保存在全局命名空间_G中;然而,我想要将它们分别保存在_test.myVar和_G.myVar中。(这是因为我想要列出该文件中的变量列表)。谢谢。
原文链接 https://stackoverflow.com/questions/4463090
# module('_test')
`module('_test')`是在Lua中定义一个模块的语法。在这里,定义了一个名为`_test`的模块。
myVar = 5
`myVar`被赋值为5。
Food = function()
end
`Food`被定义为一个空函数。
然后,在其他文件中:
``` require 'test.lua' --> 或者 loadfile('test.lua')()
require 'test.lua'
语句将加载名为test.lua
的文件。如果成功,它将返回true
,否则返回nil
。loadfile('test.lua')()
函数在运行该文件后以函数的形式返回其代码块。
print(myVar) --> nil print(Food) --> nil print(_test.myVar) --> 5 print(_test.Food) --> function
以上代码输出了nil
,因为myVar
和Food
都没有在使用module()
语法定义为模块的一部分。而_test.myVar
和_test.Food
都是可见的,因为它们是_test
模块的一部分。_test.myVar
的值为5,而_test.Food
是一个函数。
以下是lhf提到的部分:
针对可能不是完全可信来源的文件,为了增加健壮性,您应该在维基百科中了解沙盒。
关键的思想是小心处理在数据文件上下文中执行的代码所能访问的全局函数和变量。一个简单的方法是构建环境表,为脚本提供全局变量,以便它只包含安全函数的白名单。您可以通过构建适当的表,然后在调用之前将其设置为新编译的脚本的环境。lua_setfenv()
和setfenv
可以分别在C API或Lua中返回的对象上使用,这些对象调用luaL_loadfile()
、loadfile
或它们的相对函数之一。一旦脚本加载并分配了环境,您就可以使用lua_pcall()
或pcall
运行它。
别忘了检查所有的错误。
脚本完成后,它所创建的变量已经在其环境表中被写入或更新,而不是_G
。
当然,该环境表还可以使用元表将您提供的某些全局变量有效地设置为只读。
为了获得额外的控制,一些人进一步加强了这个思想,并安排限制虚拟指令周期数或允许脚本运行的真实时钟时间的数量。甚至可以在加载后检查字节码中的某些操作码。这可用于在许多情况下防止尝试执行包含循环的脚本。
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在运行脚本之前使用
lua_setfenv
。