Lua函数指针传入函数所属者参数
来源:互联网 发布:淘宝直通车养词技巧 编辑:程序博客网 时间:2024/05/29 19:26
test.lua
local test = {} --定义一张table
test.name = "测试者"
function test:sayHiTo(person)
return self.name .. "say hi to "..person
local callTest = {}
callTest.testFunc = test.sayHiTo
print(callTest.testFunc("jason"))
-----------------------
结果报错:
stdin:1: attempt to concatenate local 'person' (a nil value)
stack traceback:
stdin:1: in function 'test'
stdin:1: in main chunk
[C]: ?
----------------------
错误的原因是 test:sayHiTo(person)等价于test.sayHiTo(test,person),这里其实是两个入参,但是调用callTest.testFunc("jason") 等价于 test.sayHiTo("jason"),这里只有一个入参,所以无法找到'person'这个参数值
----------------------
当然你可以尝试自己随便传第一个参数如:
callTest.testFunc("默认参数","jason")
-------------------------------------
结果还是报错:
stdin:1: attempt to concatenate field 'name' (a nil value)
stack traceback:
stdin:1: in function 'test'
stdin:1: in main chunk
[C]: ?
-------------------------------------
为什么,因为"默认参数"并没有name属性。
-------------------------------------
那是不是可以给第一个参数增加name属性就ok呢?
local extra = {}
extra.name = "哈哈"
print(callTest.testFunc(extra,"jason"))
-------------------------------------
结果输出:哈哈say hi to jason
没报错。
所以self就是指代传进来的第一个参数。
-------------------------------------
那怎么把test作为第一个参数传进去呢?
在同一个文件里是可以直接取到test变量的,可以直接这样做:callTest.testFunc(test,"jason")
那要是在不同文件里去调test的方法呢?因为test是定义成local的,所以作用域是在所属的test.lua文件
-------------------------------------
我们可以再包装一层,lua的引用可以是变量,可以是函数,都可以
那么我们这样封装一下:
local function createInovation(target,method)
return function(...) return method(target, ...)
end
callTest.testFunc = createInovation(test,test.sayHiTo)
这样就可以正常使用了
createInovation()方法主要是重新构建一个函数,这个函数返回带第一个参数是target的函数
- Lua函数指针传入函数所属者参数
- 指针作为参数传入函数的陷阱
- c++ 成员函数作为函数指针参数传入
- c++ 成员函数作为函数指针参数传入
- 匿名函数的参数传入
- 链表、二叉树为什么要给函数传入的头参数为指针的指针
- 函数之传入参数,传出参数
- C#调OCX函数并传入指针
- gdb 传入main函数参数的方法
- Main函数参数argc,argv如何传入
- JS函数 获得 传入参数对象
- JS函数获得传入参数数组
- eclipse java 给main函数传入参数
- 如何将二位数组作为参数传入函数。
- C中函数传入参数不确定问题
- 程序调试向main()函数传入参数
- Main函数参数argc,argv如何传入
- CreateRemoteThread函数多参数传入使用方法
- 2697: 特技飞行
- openMp概论
- Tomcat中context.xml配置各种数据库连接池
- 蓝牙设置设备名
- Unity3D学习之 ------------------------ "Hello Unity"控制角色移动
- Lua函数指针传入函数所属者参数
- SetupApi.pas
- 跟踪IO请求:blktrace
- 什么是 whitened
- 浅析ATL中类厂的创建及其IUnkown接口的获取
- 【Unity3D】【NGUI】UITable
- 明天
- 三个坐标(x1,y1),(x2,y2),(x3,y3)怎样求其面积
- vim基本命令