【问题标题】:What is a way to reload lua scripts during run-time?在运行时重新加载 lua 脚本的方法是什么?
【发布时间】:2011-02-18 05:12:50
【问题描述】:

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

【问题讨论】:

    标签: scripting lua


    【解决方案1】:

    如果 (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) 不影响全局或其他表,那么只需重新加载脚本也可以正常工作。

    【讨论】:

      【解决方案2】:

      只需使用您自己的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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2020-10-22
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 2015-11-07
        相关资源
        最近更新 更多