且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-07 12:51:04

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

如果您不想从源多次加载模块",则必须为其分配一个名称并在表中保存一些标志.您甚至可以提供卸载"功能,以便您可以再次从源代码加载模块.它可以在 Lua 中重新实现,如下所示:

做本地加载模块 = {} -- 本地所以它不会泄漏到 _G功能加载模块(名称,来源)如果loadedModules[name] 则返回loadedModules[name] endLoadedModules[name] = assert(loadstring(source))() 或 true结尾函数卸载模块(名称)LoadedModules[name] = nil结尾结尾

I am using LuaJava and C Code for Lua. What I am trying to do is read Lua source stored as a resource String in an Android application so that the Lua source read in can be executed. I need to know how to do this using LuaJava or C language.

I want to know how I can create a Lua module in Lua by using a String.

In other words, I am storing Lua source that would be stored in a .lua file in a String instead. I then want to load the contents of this string into Lua as an available module that can be called.

I see there is a loadstring() function but not sure how this would be invoked for LuaJava or C.

I don't want Lua to search the file system for this file, I will find the file and convert it to a string. After I have the string, I need to know how to load the string copy of the file contents into Lua as a module that I can then call.

I also want to know if after calling loadstring(s) if the module will remain available for subsequent function calls without having to reload do the loadstring() again.

If you need to load/compile a string from LuaJava, you can use the function LuaState.LloadString(String source).

If you do not want to load a "module" from source multiple times, you have to assign it a name and save some flag in a table. You can even provide "unloading" so that you could load a module from source again. It could be reimplemented in Lua as follows:

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