Как можно перезагрузить сценарии lua во время выполнения? - PullRequest
5 голосов
/ 11 мая 2010

Я хочу перезагрузить сценарии lua во время выполнения. Каковы способы сделать это? Вам просто нужно заново инициализировать систему lua и затем перечитать все файлы lua?

Ответы [ 2 ]

13 голосов
/ 11 мая 2010

Если (а) сценарии Lua находятся в модулях и (б) модули не влияют на глобальные переменные или таблицы вне области действия модуля, вы можете использовать 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
> 

Точно так же, если немодульные скрипты хорошо себя ведут в том, что они (а) определяют только одну таблицу и (б) не влияют на глобальные или другие таблицы, тогда просто перезагрузите скрипт тоже будет работать.

1 голос
/ 15 марта 2014

Просто используйте свою собственную функцию 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
...