1. 程式人生 > >lua-5.1 和 lua-5.2 之間的一些差異。

lua-5.1 和 lua-5.2 之間的一些差異。

1. luaL_register 2 luaL_setfuncs

lua5.1 之中有一個luaL_register,用於把luaL_Reg 陣列中的所有函式註冊到lua中。但在lua5.2中已經不支援這一函數了,

lua5.2的手冊中建議使用luaL_setfuncs來替代luaL_register.

使用如下。

[cpp] view plaincopyprint?
  1. int luaopen_libname(lua_State *L)  
  2. {  
  3.     staticconst luaL_Reg funcs[] = {  
  4.     {"func1", func1},  
  5.         {"func2", func2},  
  6.     {NULL, NULL}  
  7.     };  
  8. #ifdef lua5.1
  9. //5.1 下直接使用luaL_register 就好
  10.     luaL_register(L, "libname", funcs);  
  11. #else //lua5.2
  12.     lua_newtable(L);   
  13.     //先把一個table壓入VS,然後在呼叫luaL_setfuncs就會把所以的func存到table中
  14.     //注意不像luaL_register這個table是個無名table,可以在的使用只用一個變數來存入這個table。
  15.     //e.g local clib = require "libname". 這樣就不會汙染全域性環境。比luaL_register更好。
  16.     luaL_setfuncs(L, funcs, 0);  
  17. #endif
  18.     return 1;  //返回table
  19. }  

luaL_register, 和 luaL_setfunc 實現很想,這不過luaL_register會先建立一個全域性table在把函式註冊到這個table中。

具體實現請參考lua源馬。

2. LUA_GLOBALINDEX 2 registry LUA_RIDX_GLOBAS

在5.1中經常會把一些C函式註冊在LUA_GLOBALINDEX 全域性table中。

e.g.

lua_pushstring(L, name)

lua_pushcfunction(L, func)

lua_settable(L, LUA_GLOBALSINDEX);

在5.2中已經移除了LUA_GLOBALSINDEX,去而帶之的是登錄檔。

在5.1中lua_setglobal() 和 lua_getgloba() 都用是LUA_GLOBALINDEX 偽索引。

在5.2中上面兩個函式都是使用的註冊標中的LUA_RIDX_GLOBAS偽索引(索引登錄檔的全域性環境)

LUA_RIDX_GLOBAS是LUA state 登錄檔中與定義的兩個值之一。另一個是

LUA_RIDX_MAINTHREAD 索引的是lua state的主執行緒狀態。

3. luaL_getn 2 lua_objlen 2 lua_rawlen

5.0->5.1->5.2

都是得到一個table的大小和#table的值相等,或一個userdata (lua 為指定的userdata分配的原始記憶體大小,或一個string的長度。

都與其他型別,返回0

還沒有寫完。。。有時間補充