在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
lua对象调用—用 "." 与 ":" 调用表中函数时的区别写这篇帖子之前,我看过许多关于绑定C++对象到Lua中的文章。总结一下他们的做法,用到元表、注册表、以及一些表中函数操作的一些基础知识以及相关的细节。 例1[Lua] 例1
1 --code 1: 2 --定义一张表obj 3 obj = {} 4 --下面的这行代码等价于obj["func"]=function(a,b,c)... 5 obj.func = function(a, b, c) 6 print(a, b, c) 7 end 8 9 print("obj:", obj) 10 obj.func(1,2) 11 obj:func(1,2) 输出: [Shell] obj: obj表地址 1 2 nil obj表地址 1 2
从上面的输出可以看出,当我们可以发现,当用"."来调用表内的函数时,与普通的函数调用没啥区别。 但是当我们用":"来调用时,会把调用这个函数的那张表的传进去第一个参数中,后面的参数与实参一样。 例2[Lua] 例2
1 --下面这种定义表中函数的当大相信大家都不陌生 2 obj = {} 3 function obj:func(a, b, c) 4 print(a, b, c) 5 end 6 7 print("obj:", obj) 8 obj.func(1, 2) 9 obj:func(1, 2) 输出: [Shell]
obj:obj表地址 2 nil nil 1 2 nil
发现了吧,当我们用如"function 表:函数名(......) .... end"的形式去定义一个表中的函数时,如果我们用"."来调用这个函数,就会得到莫名其妙的东西,这个现象不再我们的讨论之内;对于上面的定义方式,如果是用":"来调用那么跟调用普通的函数没啥区别。 这个了解一下就好,因为我们用lua c api 操作表中函数时用的是上上面的那种定义形式。 例3[Lua] 例3
1 obj = {} 2 obj.func = function(a, b, c) 3 print(a, b, c) 4 end 5 6 mtable = {__index = obj} 7 otherobj = {} 8 9 setmetatable(otherobj, mtable) 10 11 print("obj:", obj) 12 print("mtable", mtable) 13 print("otherobj:", otherobj) 14 15 otherobj.func(1, 2) 16 otherobj:func(1, 2) 输出: [Shell]
obj: obj表地址 mtable: mtable表地址 otherobj: otherobj表地址 1 2 nil otherobj表地址 1 2
从上面的结果可以知道,就算是在触发__index元方法调用的函数,如果是用":"来调用,那么一样会传入调用这个函数的那张表进第一个参数,就算是嵌套多层元表也是如此,大家感兴趣可以试一试嵌套多层元表,结果是一样的。 例4[C] 例4
1 //filename:funct.c 2 3 #define LUA_LIB 4 #include <lua.h> 5 #include <lualib.h> 6 #include <lauxlib.h> 7 8 static int _c_l_testfunc(lua_State* L) 9 { 10 unsigned char argc, index; 11 const char *typename; 12 if ((argc = lua_gettop(L)) != 0) { 13 printf("共传入 %d 个参数\n", argc); 14 for (index = 1; index <= argc; index++) { 15 printf( 16 "第 %d 个参数类型为: %s\n", 17 index, lua_typename(L, lua_type(L, index)) 18 ); 19 } 20 } else { 21 puts("0 个参数传入"); 22 } 23 24 //清空栈 25 lua_settop(L, 0); 26 27 //把参数个数压入栈作为返回值 28 lua_pushinteger(L, argc); 29 30 return 1; 31 } 32 33 #if define(__cplusplus) 34 #define EXP_FUNC __declspec(dllexport) 35 #else 36 #define EXP_FUNC 37 #endif 38 39 40 LUA_API EXP_FUNC int luaopen_funct(lua_State* L) 41 { 42 lua_pushcfunction(L, _c_l_testfunc); 43 return 1; 44 }
上面的这个函数又来输出调用这个函数时的参数以及参数的类型。 例5[lua] 例5
1 funct = require "funct" 2 3 --建一个表来存这个函数 4 obj = {} 5 obj.func = funct 6 7 print("\".\"调用:") 8 obj.func(1, "str") 9 print("\":\"调用:") 10 obj:func(1, "str") 输出: [Shell]
"."调用: 共传入 2 个参数 第 1 个参数类型为: number 第 2 个参数类型为: string ":"调用 共传入 3 个参数 第 1 个参数类型为: table 第 2 个参数类型为: number 第 3 个参数类型为: string
发现了吧,与lua内函数定义的函数传参没区别。如果大家半信半疑的话再把刚才那个C代码改一下,再添加一个把某个参数位置的值输出出来。这跑一下这个例子就明白了。现在告诉大家的是就算是CFunction,我们使用":"调用时也会把调用这个函数的表传进第一个参数,这使得我么把C++绑进lua中有方法可寻。
参考:https://www.52pojie.cn/thread-833988-1-1.html |
请发表评论