加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua-5.1 和 lua-5.2 之间的一些差异。

发布时间:2020-12-14 22:19:49 所属栏目:大数据 来源:网络整理
导读:1. luaL_register 2 luaL_setfuncs lua5.1 之中有一个luaL_register,用于把luaL_Reg 数组中的所有函数注册到lua中。但在lua5.2中已经不支持这一函数了, lua5.2的手册中建议使用luaL_setfuncs来替代luaL_register. 使用如下。 int luaopen_libname(lua_State

1. luaL_register 2 luaL_setfuncs

lua5.1 之中有一个luaL_register,用于把luaL_Reg 数组中的所有函数注册到lua中。但在lua5.2中已经不支持这一函数了,

lua5.2的手册中建议使用luaL_setfuncs来替代luaL_register.

使用如下。

int luaopen_libname(lua_State *L)
{
    static const luaL_Reg funcs[] = {
	{"func1",func1},{"func2",func2},{NULL,NULL}
    };
#ifdef lua5.1
//5.1 下直接使用luaL_register 就好
    luaL_register(L,"libname",funcs);
#else //lua5.2
    lua_newtable(L); 
    //先把一个table压入VS,然后在调用luaL_setfuncs就会把所以的func存到table中
    //注意不像luaL_register这个table是个无名table,可以在的使用只用一个变量来存入这个table。
    //e.g local clib = require "libname". 这样就不会污染全局环境。比luaL_register更好。
    luaL_setfuncs(L,funcs,0);
#endif
    return 1;  //返回table
 
}

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

还没有写完。。。有时间补充

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读