关于C与lua

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值