Могу ли я загрузить несколько библиотек с помощью ffi.load в LuaJIT?

#lua #ffi #luajit

#lua #ffi #luajit

Вопрос:

Возможно ли загружать более одной библиотеки одновременно с помощью ffi.load в LuaJIT?

Может ли что-то подобное работать?

 local ffi = require("ffi")
local bor = require("bit").bor
ffi.cdef([[
   // C bindings from each library!
]])
return ffi.load(bor("lib1", "lib2", "lib3"))
  

Ответ №1:

На самом деле вы не можете импортировать несколько библиотек в один userdata из-за того, как работает библиотека LuaJIT FFI. Единственное, что вы можете легко сделать, это вызвать userdata getter в защищенном вызове, поскольку LuaJIT FFI выдает ошибку для неопределенного символа и перебирает каждую библиотеку, которую вы хотите извлечь.

 local function get(t, k)
  return t[k]
end

local superlib = setmetatable({
  ffi.load "a",
  ffi.load "b",
  ffi.load "c"
}, {
  __index = function (self, k, v)
    for _,l in ipairs(self) do
      local status, val = pcall(get, l, k)
      if status then
        return val
      end
    end
  end
})