2010-05-11 11 views

Respuesta

13

si (a) los scripts Lua están en modules, y (b) los módulos no afectan a las variables globales o mesas fuera del alcance del módulo, se pueden utilizar para causar package.loaded.????? = nilrequire para recargar el módulo:

> 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 
> 

De forma similar, si los scripts non-module se comportan bien porque (a) solo definen una sola tabla, y (b) no afectan a globales ni a otras tablas, entonces simplemente volver a cargar la secuencia de comandos también funcionará.

0

Sólo tiene que utilizar su propio include(filename) función:

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 
Cuestiones relacionadas