2014-11-01 32 views
0

我有一個在Lua中定義的表/對象。我試圖從C-API dll中添加一些方法。我可以一次只附加一個方法,但其中有很多。下面代碼的最後一行是我想如何做到的。它應該將這些方法合併到Utilities對象中,以便我不必一次一個地完成它們。我收到以下錯誤:如何使用LuaJIT和FFI將clib函數合併到表中?

bad argument #1 to 'pairs' (table expected, got userdata)" const char * 

下面是一些示例代碼:

Utilities = {} 

-- 
-- Other Code that defines/attaches methods to Utilities 
-- 

-- Define some methods from my utilities.dll 
local ffi = require("ffi") 
ffi.cdef[[ 
void LogThis(const char * format, ...); 
]] 

local utilities_ffi = ffi.load("utilities") 

-- This works 
utilities_ffi.LogThis("hello world") 

-- merge the two tables together (this fails) 
for k,v in pairs(utilities_ffi) do Utilities[k] = v end 

FFI必須返回用戶數據對象。

回答

1

FFI庫對象不支持迭代;你不能在其上運行pairs。您必須手動爲每個功能編寫分配。

另外請記住,直接從庫對象訪問C函數的速度會更快,而不是將它們存儲在表(甚至是本地變量)中並在那裏訪問它們。請參閱the FFI tutorial的最後一部分。

0

試試這個:

local function get(C, k) 
    return C[k] 
end 
function merge(C1, C2) 
    return setmetatable({}, {__index = function(t, k) 
     local ok, ret = pcall(get, C, k) 
     local v = ok and ret or C2[k] 
     t[k] = v --cache it 
    end}) 
end 

Utilities = merge(utilities_ffi, other_ffi) 
相關問題