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,--1
	str= "hello",
}
------------------------
local tbl = {
	str = "hello",
}
function tbl:func() end --2
----------------------------
local tbl = {
	str = "hello",
}
function tbl.func() end --3

function 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()

个人理解,如有问题,欢迎留言。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值