从文件中获取变量

假设我有一个名为"test.lua"的文件,内容如下:

myVar = 5

Food = function()

end

如果我通过loadfile或者Lua API(在C ++或其他语言中)加载并运行文件,变量将会被保存在全局命名空间_G中;然而,我想要将它们分别保存在_test.myVar和_G.myVar中。(这是因为我想要列出该文件中的变量列表)。谢谢。

原文链接 https://stackoverflow.com/questions/4463090

点赞
stackoverflow用户107090
stackoverflow用户107090

在运行脚本之前使用lua_setfenv

2010-12-16 18:32:32
stackoverflow用户501459
stackoverflow用户501459
# 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,否则返回nilloadfile('test.lua')()函数在运行该文件后以函数的形式返回其代码块。

print(myVar) --> nil print(Food) --> nil print(_test.myVar) --> 5 print(_test.Food) --> function

以上代码输出了nil,因为myVarFood都没有在使用module()语法定义为模块的一部分。而_test.myVar_test.Food都是可见的,因为它们是_test模块的一部分。_test.myVar的值为5,而_test.Food是一个函数。

2010-12-16 20:03:46
stackoverflow用户68204
stackoverflow用户68204

以下是lhf提到的部分:

针对可能不是完全可信来源的文件,为了增加健壮性,您应该在维基百科中了解沙盒

关键的思想是小心处理在数据文件上下文中执行的代码所能访问的全局函数和变量。一个简单的方法是构建环境表,为脚本提供全局变量,以便它只包含安全函数的白名单。您可以通过构建适当的表,然后在调用之前将其设置为新编译的脚本的环境。lua_setfenv()setfenv可以分别在C API或Lua中返回的对象上使用,这些对象调用luaL_loadfile()loadfile或它们的相对函数之一。一旦脚本加载并分配了环境,您就可以使用lua_pcall()pcall运行它。

别忘了检查所有的错误。

脚本完成后,它所创建的变量已经在其环境表中被写入或更新,而不是_G

当然,该环境表还可以使用元表将您提供的某些全局变量有效地设置为只读。

为了获得额外的控制,一些人进一步加强了这个思想,并安排限制虚拟指令周期数或允许脚本运行的真实时钟时间的数量。甚至可以在加载后检查字节码中的某些操作码。这可用于在许多情况下防止尝试执行包含循环的脚本。

2010-12-17 22:50:15