2013-09-27 35 views
21

我適應了Lua的< 5.2編寫的圖書館和得到了一個電話,我不知道等價的:luaL_openlib替代的Lua 5.2

luaL_openlib(L, "Polycore", polycoreLib, 0); 

polycoreLib

static const struct luaL_Reg polycoreLib [] 

我該如何取代luaL_openlib的電話?

的LUA維基唯一states

呼叫如luaL_openlib(L, name, lreg, x);應仔細改寫,因爲與給定名稱的全局表進行搜索並可能產生。

回答

28

有兩個答案是:一個在這裏複製早期版本的行爲(在其中創建一個全局表),以及一個用於實現,現在是傳統的行爲(這是創建並返回一個匿名錶)。

對於前者:

lua_newtable(L); 
luaL_setfuncs(L, polycoreLib, 0); 
lua_setglobal(L, "Polycore"); 

這不是相當一樣luaL_openlib,因爲如果有一個現有的全局表Polycore將覆蓋它,而不是與它合併。如果合併是一個問題,使用lua_getglobal第一,那麼如果它推表重新使用,而不是創建一個新問題:

lua_getglobal(L, "Polycore"); 
if (lua_isnil(L, -1)) { 
    lua_pop(L, 1); 
    lua_newtable(L); 
} 
luaL_setfuncs(L, polycoreLib, 0); 
lua_setglobal(L, "Polycore"); 

後者更容易,因爲你不需要關心合併:

lua_newtable(L); 
luaL_setfuncs(L, polycoreLib, 0); 
return 1; 

採用這種方法,這是調用者的表綁定,reponsibility如:

local Polycore = require "Polycore" 
+0

所以我有一個要添加自己的函數調用到全局庫中的多個對象。試圖找出如何在5.3中做到這一點總會讓我回到這個答案,但這個答案沒有足夠的信息給我。第一個代碼塊將覆蓋以前的條目。該修補程序在lua_getglobal()調用中引發nil引用問題,而我不知道最後一個查詢是如何查找或綁定到名稱「Ploycore」的。我錯過了什麼? – James

+0

此外,在最後的返回1使它感覺它是爲了在luaopen_Polycore()調用...我可以在luaL_newlib()調用安全後在那裏做我的元表創建? (我得到我的gettop()調用是錯誤的)。 (和luaL_newlib()是lua_newtable()luaL_setfuncs()調用的包裝。有點) – James

+2

@James'luaL_setfuncs'使用堆棧頂部的表。因此,與現有表合併只需將該表放入堆棧而不是新表。如果該提取的表已經可以從全局名稱獲得,那麼它將從全局名稱保持可用。顯然,你無法將表格與相同的鍵合併。如果你需要(或子表),那麼你需要以某種方式手動處理。 (子表很容易,因爲您只需創建一個新表並將其插入獲取的表中。) –