lua 冒号和点调用函数的一些问题 |
您所在的位置:网站首页 › lua函数调用外部lua › lua 冒号和点调用函数的一些问题 |
lua中函数的调用可以是用冒号调用,也可以使用点调用,其二者的区别是使用冒号调用的时候会隐式的将调用函数的调用者作为第一个参数赋值为self,就可以在函数里面直接使用self来获取调用者的里面的数据。使用点调用的话,可以直接使用调用者来获取数据。 我遇到如下问题: local tbl = {func = function(tmp) print(tmp)end, }function test()tbl.func() tbl:func() end结果为 nil table: 0x18ff080 这里使用冒号调用和点调用打印出来的东西不一样,按理来说应该打印出来都是nil才对,但是使用冒号调用的时候打印的是一个表地址,这里打印的是哪个表的地址,这里的表只有tbl这个,所以只可能是tbl的地址,验证一下。 local tbl = {func = function(tmp) print(tmp)end, }function test()tbl.func()tbl:func()print(tbl) end结果为: nil table: 0x12f2a70 table: 0x12f2a70 这里可以看出的确是tbl,我们再做一个实验: local tbl = {func = function() print(self)end, }function test()tbl.func()tbl:func()print(tbl) end结果为: nil nil table: 0x1189a80 这里我们可以看出,在这里不像我们之前认为的使用冒号调用隐式的传了一个self给函数,这里的确是将第一个参数作为是调用者,但是不是隐式,而是显示的传入。 local tbl = {func = function() end,--1str= "hello", } ------------------------ local tbl = {str = "hello", } function tbl:func() end --2 ---------------------------- local tbl = {str = "hello", } function tbl.func() end --3function test()tbl.func()tbl:func() end这里我们可以看出这三种定义table的函数的使用是不同的,要在函数中使用tbl的str的话: 1、使用第一种定义,函数内部的self为nil。 如果是使用点调用,需要显示将调用者传入到函数中,如下: local tbl = {func = function(parm1) print(parm1.str) end,str= "hello", }tbl.func(tbl)使用冒号调用,会将调用者作为第一个参数隐式的传递给函数 local tbl = {func = function(parm1) print(parm1.str) end,str= "hello", }tbl:func()2、使用第二种方法定义,可以在函数里面直接使用调用者。 如果是使用点调用的话,会将第一参数传递给self,无参时self为nil, local tbl = {str = "hello", } function tbl:func() print(self.str) print(tbl.str) end tbl.func(tbl)使用冒号调用时,会隐式将调用者传递给self local tbl = {str = "hello", } function tbl:func() print(self.str) end tbl:func()3、使用第三种方法定义,函数内的self为nil,在函数里面可以直接使用调用者 使用点调用函数 local tbl = {str = "hello", } function tbl.func() print(tbl.str) end tbl.func()使用冒号调用的话,会将调用者隐式赋值给函数第一个参数,如果调用时传了其他的参数,则第一参数为定义第二参数,以此类推 local tbl = {str = "hello", } function tbl.func(parm1, parm2) print(parm1.str) end tbl:func() 个人理解,如有问题,欢迎留言。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |