Lua loadfile()和通过名称调用文件中定义的函数

在Lua中如何使用loadfile()加载像

function test() print('test') end

这样的函数,然后通过名称执行它呢?例如,如果我使用loadfile(),然后pcall()文件的内容被执行了。那么我怎么调用test()呢?

编辑:'test'函数可能是在文件中定义的任意函数。

编辑2:在沙盒环境中?

点赞
用户5401681
用户5401681

你想要创建一个名为 test 的函数吗?那么你可以这样做:

   function test()
            print('test')
   end

然后这样调用它:

test()

如果你想要从其他文件中加载它,比如上面的代码在一个名为 "scripts.scriptTest" 的文件中,那么从你的主文件中调用它将会是:

local scriptTest = require("scripts.scriptTest")
scriptTest.test()
2016-11-23 15:12:47
用户2561675
用户2561675

Egor的评论让我知道了这个解决方案; loadstring / loadfile返回一个“块”,它可以被执行。 任何定义在那里的函数都会添加到_G,全局环境中。 函数setfenv(function,environment)将在函数中定义的函数添加到提供的环境中。 然后可以通过名称调用该函数。 令人困惑? 是的,请参见此示例:

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
2016-11-24 02:39:47