2010-05-18 134 views
0

我正在使用swig-lua。我在Lua中調用了一個函數,它返回一個指針(userdata)。現在我知道這個指針是什麼,但是我怎麼能從Lua中告訴Lua?Lua/SWIG從Lua內包裝userdata

回答

3

Lua Reference Manual

setmetatable(表,元表)

設置爲給定的 表元表。 (您不能 元表其他類型的從Lua僅從C.改變, )

你不能「告訴Lua的」什麼是userdata是在Lua。必須給它一個metatable或通過使用C API的綁定函數調用進行操作。有關更多信息,請參閱chapter 28.1 of Programming in Lua (Pil)

0

userdata的定義是,Lua沒有,不能,也不想知道它是什麼。這是你的數據 - 它是什麼是你的問題。如果你想操作它,那麼你必須調用它的C函數(操作符可通過metatable設置重載)。

+0

我不是說Lua應該知道。我知道它不能,但SWIG不能說什麼? – 2010-05-18 15:37:54

+0

SWIG只能執行默認API中可用的操作,它不能重寫源或語言。當lua_touserdata返回一個void *時,除非SWIG使用一個內部的獨立系統來自動處理這個結果並將正確的類型傳遞給你,所有你可以得到的都是void *。 – Puppy 2010-05-18 20:04:00

-1

告訴SWIG關於指針void指向的數據類型。如果SWIG知道這個類型,那麼它會將它作爲一個userdata傳遞給Lua,並附帶一個適當的元表連接,允許Lua端訪問和修改各個數據字段(如果它是一個類,則調用它的方法) 。

這可能意味着告訴SWIG有關圖書館不需要的某些數據類型,但從長遠來看可能值得付出努力。

所有的Lua都知道它的metatable中包含了一個userdata的類型。兩個userdata值是相同的類型,如果他們具有相同的metatable。該metatable負責調解所有從Lua端訪問其內容,並且通常由C中實現的方法組成,以便可以做到。如果沒有這樣的mettaable,那麼Lua方面只能將userdata視爲不透明的blob。