【发布时间】:2011-02-18 05:12:50
【问题描述】:
我想在运行时重新加载 lua 脚本。有什么方法可以做到这一点?是否只需要重新初始化lua系统,然后重新读取所有lua文件?
【问题讨论】:
我想在运行时重新加载 lua 脚本。有什么方法可以做到这一点?是否只需要重新初始化lua系统,然后重新读取所有lua文件?
【问题讨论】:
如果 (a) Lua 脚本在 modules 中,并且 (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
>
同样,如果non-module 脚本表现良好,因为它们 (a) 只定义了一个表,并且 (b) 不影响全局或其他表,那么只需重新加载脚本也可以正常工作。
【讨论】:
只需使用您自己的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
【讨论】: