lua中创建类(主要是元表 setmetatable 与 __index) 参考:http://www.runoob.com/lua/lua-metatables.html
LClass= { value=3 }
function LClass:new(v)
o={}
setmetatable(o, LClass)
LClass.__index=LClass
o.value=v
return o
end
function LClass:test()
print('value=' .. self.value)
end
oo=LClass:new(33)
oo:test() -- 输出 value=33
用C创建lua类呢?
#define classname "luaclass"
struct luaclassObject {
int id;
char name[10];
void *context;
};
static int luaclass_new(lua_State * L) {
struct luaclassObject *object = lua_newuserdata(L, sizeof(struct luaclassObject));
memset(object, 0, sizeof(struct luaclassObject));
luaL_getmetatable(L, classname);
lua_setmetatable(L, -2);
object->context = malloc(100);
memset(object->context, 'Q', 99);
return 1;
}
static int luaclass_gc(lua_State * L) {
struct luaclassObject *object = luaL_checkudata(L, 1, classname);
if (object->context) {
free(object->context);
printf("free->luaclass\n");
}
return 1;
}
//
static int luaclass_test(lua_State * L) {
struct luaclassObject *object = luaL_checkudata(L, 1, classname);
printf("%s\n", (char*)object->context);
return 1;
}
static const luaL_Reg luaclass[] = {
{ "new", luaclass_new },
{ "__gc", luaclass_gc },
{ "test", luaclass_test },
{ NULL, NULL }
};
int luaopen_luaclass(lua_State *L) {
luaL_newmetatable(L, classname); /* create metatable luaclass*/
lua_pushvalue(L, -1); /* metatable.__index = metatable luaclass.__index=luaclass */
lua_setfield(L, -2, "__index");
luaL_register(L, NULL, luaclass); /* fill metatable */
lua_pop(L, 1);
luaL_register(L, classname, luaclass); /* create module */
return 1;
}
void luaL_openluaclass(lua_State *L) {
lua_pushcfunction(L, luaopen_luaclass);
lua_pushstring(L, classname);
lua_call(L, 1, 0);
}
Lua中使用方法:
obj=luaclass:new()
obj:test() --输出99个Q
lua是在栈上运行的脚本语言(针对用C相互调用lua来说),先了解怎么操作lua栈,再了解怎么调用lua方法操作栈数据,lua.h中 :
stack->Lua: 将lua栈数据设置到lua数据中
Lua->stack: 将lua数据取出来放到栈,一般是栈顶
C->stack:在C中把数据放入栈中,如:放入数字,字符串,函数等。。
stack->C: 读取栈上的数据到C中,如:转换栈第1位置数据为数字 lua_tonumber(L,1);