Как загрузить модуль Lua в виде строки вместо файла? - PullRequest
4 голосов
/ 22 декабря 2011

Я использую LuaJava и C-код для Lua. Я пытаюсь прочитать исходный текст Lua, хранящийся в виде строки ресурса в приложении Android, чтобы можно было выполнить считывание исходного кода Lua. Мне нужно знать, как это сделать, используя язык LuaJava или C.

Я хочу знать, как я могу создать модуль Lua в Lua, используя строку.

Другими словами, я храню исходный код Lua, который вместо этого будет храниться в файле .lua в строке. Затем я хочу загрузить содержимое этой строки в Lua как доступный модуль, который можно вызвать.

Я вижу, что есть loadstring() функция, но не уверен, как это будет вызываться для LuaJava или C.

Я не хочу, чтобы Lua искал файловую систему для этого файла, я найду файл и преобразую его в строку. После того, как у меня есть строка, мне нужно знать, как загрузить строковую копию содержимого файла в Lua как модуль, который я затем могу вызвать.

Я также хочу знать, если после вызова loadstring(s) модуль останется доступным для последующих вызовов функций без перезагрузки, выполните loadstring() снова.

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Если вам нужно загрузить / скомпилировать строку из 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
1 голос
/ 22 декабря 2011

Я не уверен, что понимаю вопрос, но здесь идет речь:

local f = io.open(filename)
local s = f:read '*a' -- read the entire contents of the file
f:close()
assert(loadstring(s))() -- parse and run string `s` as Lua code
...