【问题标题】:Lua loadfile() and Call a Function Defined in the File By NameLua loadfile() 并按名称调用文件中定义的函数
【发布时间】:2016-11-26 00:14:11
【问题描述】:

在 Lua 中如何使用 loadfile() 来加载类似的函数

function test() print('test') end

然后按名称执行?例如如果我loadfile() 然后pcall() 文件的内容被执行。那么我该如何调用 test()?

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

Edit2:在沙盒环境中?

【问题讨论】:

  • assert(loadfile("test_func.lua"))(); test() 应该在执行文件内容后 test() 成为全局函数。

标签: lua


【解决方案1】:

Egors 的评论让我转向了这个解决方案; 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

【讨论】:

    【解决方案2】:

    您正在尝试创建一个名为 test 的函数?然后就是这样:

       function test()
                print('test')
       end
    

    并通过以下方式调用它:

    test()
    

    如果你想从另一个文件加载它,假设上面的代码在一个名为“scripts.scriptTest”的文件中,那么将它调用到你的主文件就像:

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

    【讨论】:

    • 这会缓存,因此如果您更改 test 并重新运行旧版本运行。这不利于发展...
    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2011-09-12
    • 1970-01-01
    • 2014-07-09
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多