有什么方法可以在运行时重新加载lua脚本?

我想在运行时重新加载 lua 脚本。有哪些方法可以做到这一点?您只需要重新初始化 lua 系统,然后重新读取所有的 lua 文件吗?

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

点赞
stackoverflow用户33252
stackoverflow用户33252

如果 (a) Lua 脚本在 模块 中,且 (b) 模块不会影响模块范围以外的全局变量或表格,可以使用 package.loaded.????? = nil 强制 require 重新加载模块:

> require "lsqlite3"
> =sqlite3.version
function: 0x10010df50
> sqlite3.version = "33"
> return sqlite3.version
33
> require "lsqlite3"
> return sqlite3.version
33
> package.loaded.lsqlite3 = nil
> return sqlite3.version
33
> require "lsqlite3"
> return sqlite3.version
function: 0x10010c2a0
>

同样地,如果非模块脚本遵循所述条件,即 (a) 只定义一个表格,且 (b) 不会影响全局变量或其他表格,那么简单地重新加载脚本也可以。

2010-05-11 16:36:21
stackoverflow用户1952626
stackoverflow用户1952626

只需使用您自己的 include(filename) 函数:

function evalfile(filename, env)
    local f = assert(loadfile(filename))
    return f()
end

function eval(text)
    local f = assert(load(text))
    return f()
end

function errorhandler(err)
    return debug.traceback(err)
end

function include(filename)
    local success, result = xpcall(evalfile, errorhandler, filename)

    --print(string.format("success=%s filename=%s\n", success, filename))
    if not success then
        print("[ERROR]\n",result,"[/ERROR]\n")
    end
end

function include_noerror(filename)
    local success, result = xpcall(evalfile, errorhandler, filename)
    --print(string.format("success=%s filename=%s\n", success, filename))
end

使用您自己的 include(filename) 函数即可:

2014-03-15 04:35:52