博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大话C与Lua(五) 面向对象的数据结构——userdata
阅读量:6425 次
发布时间:2019-06-23

本文共 1901 字,大约阅读时间需要 6 分钟。

hot3.png

 

如何实现面向对象?

 

    熟悉Lua的同学都知道!在Lua内部已经实现了面向对象的基本机制(table);

    同时也为宿主语言(在这里是C语言)提供了一套自定义数据结构(userdata)。所以,我们可以简单的利用metatable与__index的访问机制,为userdata实现一套简单的面向对象的访问方式。

 

stu.c

#include 
#include
#include
typedef struct _Student{ const char * strName ; // 学生姓名 int strNum ; // 学号 int iSex ; // 学生性别 int iAge ; // 学生年龄}Student;int lnew(lua_State* L){ Student *stu = lua_newuserdata(L,sizeof(Student)); if(NULL == stu){ return 0; } luaL_setmetatable(L,"stu"); return 1;}int lset(lua_State* L){ Student *stu = luaL_checkudata(L,1,"stu"); stu->strName = luaL_checkstring(L,2); stu->strNum = luaL_checkinteger(L,3); stu->iSex = luaL_checkinteger(L,4); stu->iAge = luaL_checkinteger(L,5); return 0;}int lget(lua_State* L){ Student *stu = luaL_checkudata(L,1,"stu"); lua_pushstring(L,stu->strName); lua_pushinteger(L,stu->strNum); lua_pushinteger(L,stu->iSex); lua_pushinteger(L,stu->iAge); return 4;}const luaL_Reg mylib[] = { {"new",lnew}, {"set",lset}, {"get",lget}, {NULL,NULL}};LUA_API int luaopen_stu(lua_State* L){ luaL_newmetatable(L,"stu"); lua_pushstring (L,"__index"); lua_pushvalue(L,-2); lua_rawset(L,-3); luaL_setfuncs(L,mylib,0); luaL_newlib(L,mylib); return 1;}

main.lua

local stu = require "stu"local stu = stu.new()print(stu)stu:set("Candy",1024,1,26)local name,id,sex,age = stu:get()print(name,id,sex,age)

 

运行结果:

[root@localhost ~]# cc -o stu.so stu.c  -Wall -O2 -fPIC -shared -std=gnu99[root@localhost ~]# lua main.lua stu: 0x19380d8Candy	1024	1	26[root@localhost ~]#

 

运行结果很简单。现在,我们简要分析一下具体实现步奏。

 

首先我们在注册表创建了一个metatable,并且起名"stu"。

然后为这个元表添加一个__index元方法,然后将自身作为键值查找域。

最后使用setfuncs为元表注入方法。

 

上述步奏等效于lua中如下操作:

local meta = {1,2,3}local t = setmetatable({},{__index=meta})print(t[1])

 

 

这里需要注意的是:

    full userdata的生命周期是由Lua来管理的。

    如果由Lua gc回收了userdata的使用空间,C语言还引用原地址将会引起段错误。

    所以如果需要完全使用C API来管理 userdata是生命周期,请使用light userdata。

转载于:https://my.oschina.net/CandyMi/blog/1305292

你可能感兴趣的文章
数据库性能优化之冗余字段的作用
查看>>
DBA_实践指南系列9_Oracle Erp R12应用补丁AutoPatch/AutoControl/AutoConfig(案例)
查看>>
数据库设计三大范式
查看>>
ionic 字体的导入方法
查看>>
IP路由原理
查看>>
内部类详解
查看>>
洛谷P2726 阶乘 Factorials 数学
查看>>
类加载机制
查看>>
火柴棒等式(2008年NOIP全国联赛提高组)
查看>>
mongodb int型id 自增
查看>>
【转】关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)...
查看>>
Java中的4种代码块
查看>>
Ocelot(七)- 入门
查看>>
生成水杯热气
查看>>
程序员工作心法
查看>>
三个常用的PHP图表类库
查看>>
python中异常处理--raise的使用
查看>>
高中数学与初中数学的接轨点
查看>>
python 安装第三方模块
查看>>
Whitelabel Error Page 专题
查看>>