使用用户数据的库示例

lua-users home
wiki

描述

此示例类似于 UserDataExampleUserDataWithPointerExample,但已更新为 Lua 5.2 API。

Lua 输入文件

function foo()
    local obj = MyLib.MakeObj()
    obj:method()
end

foo()
        

C 代码

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

const static char *Obj_typename = "ObjTypename";

void check_Obj(lua_State *L, int i){
	luaL_checkudata(L, i, Obj_typename);
}

int MyLib_MakeObj(lua_State *L){
	printf("In MyLib_MakeObj\n");
	lua_newuserdata(L, sizeof(int*));
	luaL_setmetatable(L, Obj_typename);
	return 1;
}
int Obj__gc(lua_State *L){
	printf("In Obj__gc\n");
	return 0;
}
int Obj_method(lua_State *L){
	printf("In Obj_method\n");
	check_Obj(L, 1);
	return 0;
}

int luaopen_MyLib(lua_State *L){
	static const luaL_Reg Obj_lib[] = {
		{ "method", &Obj_method },
		{ NULL, NULL }
	};
	
	static const luaL_Reg MyLib_lib[] = {
		{ "MakeObj", &MyLib_MakeObj },
		{ NULL, NULL }
	};
	
	luaL_newlib(L, MyLib_lib);

	// Stack: MyLib
	luaL_newmetatable(L, Obj_typename); // Stack: MyLib meta
	luaL_newlib(L, Obj_lib);
	lua_setfield(L, -2, "__index"); // Stack: MyLib meta
	
	lua_pushstring(L, "__gc");
	lua_pushcfunction(L, Obj__gc); // Stack: MyLib meta "__gc" fptr
	lua_settable(L, -3); // Stack: MyLib meta
	lua_pop(L, 1); // Stack: MyLib
	
	return 1;
}

int main(int argc, char *argv[]){
	int iarg;
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);
	
	luaL_requiref(L, "MyLib", &luaopen_MyLib, 1);
	lua_pop(L, 1); // requiref leaves the library table on the stack

	printf(" stack top: %d\n", lua_gettop(L));
	for(iarg = 1; iarg < argc; ++iarg){
		int s = luaL_loadfile(L, argv[iarg]);

		if(s != 0){
			fprintf(stderr, "Could not load: %s\n", argv[iarg]);
			continue;
		}
		s = lua_pcall(L, 0, 0, 0);
		if(s != 0){
			fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
			lua_pop(L, 1);
		}
	}
	lua_close(L);
	return 0;
}
        

编译代码

gcc -I/usr/include/lua5.2 ex.c -llua5.2 -o lualibex
        

预期输出

 stack top: 0
In MyLib_MakeObj
In Obj_method
In Obj__gc
        

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2012 年 12 月 17 日凌晨 12:49 GMT (差异)