美文网首页cocos2d-x
Lua 用户自定义类型

Lua 用户自定义类型

作者: 小城大麦 | 来源:发表于2016-08-16 17:29 被阅读92次

Lua 用户自定义类型

userdata:lua提供的一种基本类型
userdata提供了一块原始的内存区域,可以用来存储任何东西。同时,Lua中没有对userdata的任何预定义操作。

//根据指定大小分配内存,并将对应的userdata压入栈,最后返回这个内存块的地址
void lua_newuserdata(lua_State*L,size_t size);

元表
针对不同类型的userdata,创建一个唯一的元表。每当创建一个userdata后,就用相应的元表来标识他。lua不能修改userdata的元表,也就无法欺骗代码。
通常,可以将userdata的元表信息放在注册表(REGISTRYINDEX),f辅助库中提供了

//创建一个新的table做元表,并将其压入栈,同时将其与注册表中指定名称关联起来
int luaL_newmetatable(lua_State*L,const char* tname);
//检索与tname相关的元表
void luaL_getmetatable(lua_State*L,const char* tname);
//检查栈的指定位置是否为元表,并且是否具有和指定名称相匹配的表
//如果正确,返回userdata的地址,否则引发一个错误
void* luaL_checkudata(lua_State*L,int index,const char*tname);

lua
//使用元表的方式,注册新类型
int luaopen_array(lua_State*L){
    luaL_newmetatable(L,"LuaBook.array");
    luaL_register(L,"array",arrayLib);
    return 1
}
static int newarray(lua_State*L){
    ...
    luaL_getmetatable(L,"LuaBook.array");//压入栈
    lua_setmetatable(L,-2);//userdata在-2
    return 1;/*新的userdata已经在栈中*/
}
//lua库中的会从栈中弹出一个table,并将其设定为指定索引对象的元表。
lua_setmetatable(L,index);

面向对象的访问

static const struct luaL_Reg arrarylib_f[] = {
    {"new",newarray},
    {NULL,NULL}
};
static const struct luaL_Reg arraylib_m[] = {
    {"set",setarray},
    ....
    {NULL,NULL}
};
//创建metatable并添加__index(table方式)
int luaopen_array(lua_State*L){
    luaL_newmetatable(L,"LuaBook.array");
    /*元表.__index==元表*/
    lua_pushvalue(L,-1);//复制元表
    lua_setfield(L,-2,"__index");
    lua_register(L,NULL,arraylib_m);//会使用栈顶的table注册函数
    lua_register(L,"array",arraylib_f);//会创建一个新table并注册指定函数
}

轻量级的userdata
内存有C控制,只需要将内存的地址传给lua

//将一个轻量级userdata放入堆栈
void lua_pushlightuserdata(lua_State*L,void*p);

相关文章

  • Lua 用户自定义类型

    Lua 用户自定义类型 userdata:lua提供的一种基本类型userdata提供了一块原始的内存区域,可以用...

  • Lua 完全教程

    Lua 环境安装 Lua 基本语法 Lua 数据类型 Lua 数据类型:nil(空) Lua 数据类型:boole...

  • Unity 实现最简单的脚本编辑器

    利用此方法也可以对DefaultAsset类型资源自定义编辑器,比如.lua文件。

  • Lua极简入门(八)——元表metatable

    Lua使用元表来定义对table或者用户自定义数据的操作。在很多情况下,可以简化或者提高table或用户自定义数据...

  • 数据类型

    Lua 数据类型 lua是动态类型语言(定义变量时不用指定变量类型) lua有8个基本类型nil、boolean、...

  • Lua type和typeof区别

    type 是lua内置的函数,用来获取类型typeof 是一个自定义的函数,为了用来获取cs的类型 代码和输入如下:

  • lua 的值类型

    lua 的值类型 lua 是动态类型的语言,即是说类型附着于值而不是变量。在 lua 脚本里,变量是没有类型的,只...

  • [lua source code] object system

    版本号:Lua 5.3 Lua Type lua 的类型定义在lobject.h这个文件里,主要的类型如下: no...

  • Go语言基础之Struct

    Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用str...

  • lua - 类型和值

    Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、str...

网友评论

    本文标题:Lua 用户自定义类型

    本文链接:https://www.haomeiwen.com/subject/gubpsttx.html