如何将Lua模块作为字符串加载而不是文件?

我正在使用LuaJava和C代码来开发Lua。我正试图从Android应用程序中存储的资源字符串中读取Lua源代码,以便可以执行读取的Lua源代码。我需要知道如何使用LuaJava或C语言实现这一点。

我想知道如何使用一个字符串在Lua中创建Lua模块。

换句话说,我正在将应该存储在.lua文件中的Lua源代码存储在字符串中。然后,我想将此字符串的内容作为可用模块加载到Lua中,以便可以调用。

我看到有一个loadstring()函数,但不确定如何在LuaJava或C中调用它。

我不希望Lua在文件系统中搜索此文件,我会找到该文件并将其转换为字符串。在获得字符串之后,我需要知道如何将文件内容的字符串副本作为模块加载到Lua中,以便我可以调用它。

我还想知道,在调用loadstring(s)后,如果模块将保持可用于后续函数调用,而无需重新加载loadstring()

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

点赞
stackoverflow用户41661
stackoverflow用户41661

我不确定我理解这个问题,但我会尝试:

local f = io.open(filename)
local s = f:read '*a' -- 读取文件的全部内容
f:close()
assert(loadstring(s))() -- 将字符串`s`解析并作为Lua代码运行
2011-12-22 05:27:24
stackoverflow用户221509
stackoverflow用户221509

如果需要从LuaJava加载/编译字符串,可以使用函数 LuaState.LloadString(String source)

如果您不希望多次从源代码加载“模块”,则必须为其指定名称并在表中保存一些标志。甚至可以提供“卸载”功能,以便可以再次从源代码加载模块。可以按如下方式在Lua中重新实现它:

do
  local loadedModules = {} -- local so it won't leak to _G
  function loadModule(name, source)
    if loadedModules[name] then return loadedModules[name] end
    loadedModules[name] = assert(loadstring(source))() or true
  end
  function unloadModule(name)
    loadedModules[name] = nil
  end
end
2011-12-22 19:27:19