概述
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()
个人理解,如有问题,欢迎留言。
最后
以上就是冷傲麦片为你收集整理的lua 冒号和点调用函数的一些问题的全部内容,希望文章能够帮你解决lua 冒号和点调用函数的一些问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复