Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 从文件中获取变量_Variables_Namespaces_Lua - Fatal编程技术网

Variables 从文件中获取变量

Variables 从文件中获取变量,variables,namespaces,lua,Variables,Namespaces,Lua,假设我有这样一个“test.lua”文件: myVar = 5 Food = function() end < >如果我通过Load文件或LuaAPI(C++或其他任何东西)加载文件并运行它,变量将保存在全局命名空间g下;但是,我希望将它们分开,比如_test.myVar和_G.myVar。(这样做的原因是我只想从该文件中获得一个变量列表)。谢谢 在运行脚本之前使用lua_setfenv module('_test') myVar = 5 Food = function() end

假设我有这样一个“test.lua”文件:

myVar = 5

Food = function()

end

< >如果我通过Load文件或LuaAPI(C++或其他任何东西)加载文件并运行它,变量将保存在全局命名空间g下;但是,我希望将它们分开,比如_test.myVar和_G.myVar。(这样做的原因是我只想从该文件中获得一个变量列表)。谢谢

在运行脚本之前使用
lua_setfenv

module('_test')

myVar = 5

Food = function()

end
然后,从其他文件:

require 'test.lua' --> or loadfile('test.lua')()

print(myVar) --> nil
print(Food) --> nil
print(_test.myVar) --> 5
print(_test.Food) --> function
他说了什么

对于可能并非来自完全可信来源的文件,您应该在wiki上阅读相关内容,以获得更高的健壮性

关键思想是要注意哪些全局函数和变量可用于在数据文件上下文中执行的代码。一种获得大量控制的简单方法是构造环境表,该表向脚本提供全局变量,以便它只包含安全函数的白名单。为此,您可以构造一个合适的表,然后在调用它之前将其设置为新编译脚本的环境。从C API或从Lua端都可以分别用于成功调用C API或从Lua返回的对象或其亲属之一。加载脚本并指定环境后,可以使用或运行脚本

别忘了检查所有的错误

脚本完成后,它创建的变量已写入或更新到其环境表中,而不是
\u G

当然,该环境表可以使用元表使您提供的脚本中的一些全局变量也成为只读的


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

但请注意,module和setfenv都不推荐使用:请参阅和。好的,问题是要从C API中实现它,但是在Lua5.2中事情似乎发生了轻微的变化。Lua5.2尚未发布。目前的版本仍然是5.1,并且
lua_setfenv
在5.1中没有被弃用。