Lua loadfile()并按名称调用文件中定义的函数

Lua loadfile()并按名称调用文件中定义的函数,lua,Lua,在Lua中,如何使用loadfile()加载函数,如 function test() print('test') end 然后按名称执行它?例如,如果Iloadfile()则执行文件的内容。然后如何调用test() 编辑:函数“test”可以是文件中定义的任意函数 Edit2:在沙盒环境中?您正在尝试创建一个名为test的函数?那么这就是为什么: function test() print('test') end 并称之为: test() 如果您想从另一

在Lua中,如何使用loadfile()加载函数,如

function test() print('test') end
然后按名称执行它?例如,如果I
loadfile()
则执行文件的内容。然后如何调用test()

编辑:函数“test”可以是文件中定义的任意函数


Edit2:在沙盒环境中?

您正在尝试创建一个名为test的函数?那么这就是为什么:

   function test()
            print('test')
   end
并称之为:

test()
如果您想从另一个文件加载该代码,假设上面的代码位于名为“scripts.scriptTest”的文件中,那么将其调用到主文件将类似于:

local scriptTest = require("scripts.scriptTest")
scriptTest.test()

Egors的评论让我想到了这个解决方案
loadstring/loadfile
返回可执行的“块”。定义的任何函数都会添加到全局环境中。函数
setfenv(函数,环境)
将函数中定义的函数添加到提供的环境中。然后可以按名称调用该函数。令人困惑是的,请参见此示例:

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> string_a = "function a(msg) print(msg) end"
> func_a = loadstring(string_a)
> env = { print = print }
> setfenv(func_a, env)
> pcall(func_a)
> for k,v in pairs(env) do print(k,v) end
    print   function: 0x19a5a40
    a   function: 0x19c9ed0
> env['a']('test')
test
assert(加载文件(“test_func.lua”)();test()
应该可以工作,因为test()在执行文件内容后成为全局函数。