lua 中 . 和 : 的区别

本文详细解析了Lua语言中使用冒号(:)和点(.)定义方法的区别,重点介绍了冒号定义方法如何自动传入self变量,以及在不同场景下如何正确调用这些方法,避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://blog.youkuaiyun.com/daimou123/article/details/50689623

在lua中使用“:”定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针,而“.”定义的函数中没有self

  function  class:func2( )  end
  function  class.func1(self)  end
  --这时候这两个函数等价

一般情况下,用:来定义的函数,调用时最好用:来调用,用 . 来定义的函数调用时最好用 . 来调用,避免产生错误

local a = {}

function a.foo()
    print("foo")
end

function a:func()
    --self.foo()  如果这里加self的话,则下面使用a.func()时就会出错
    print("func")
end

a:func() -- 没有self的情况下与a.func()相同
a:foo() -- 没有self的情况下与a.foo()相同

:定义的函数默认传入一个self

local MainScene = {}

function MainScene:ctor()
    self:ceshi(1, 2, 3) --实际上传入的参数为self,1,2,3
end
function MainScene.ceshi(a, b, c) --接收时只接收了self,1,2
    print(a, b, c)
end

MainScene:ctor()
--输出 table:00A391B0  1  2
--第一个输出的实际为self,这里也就是MainScene表的地址了

:定义的函数默认接收一个self

local MainScene = {}

function MainScene:ctor()
    self.ceshi(1, 2, 3)
end
function MainScene:ceshi(a, b, c)
    --接收时默认接收一个self,所以掉用时的第一参数1被接收赋值给self
    --其余俩个参数分别赋值给a,b 而c没有被赋值则为nil
    print(self) --1
    print(a, b, c) --2  3  nil
end

MainScene:ctor()

通常情况下,我们用 . 来访问表中的属性,用 : 来访问表中的函数(带self的)

下列程序中,foo函数用到了self,所以在定义时用:来定义,同时调用foo函数时也应该用:来调用,a.on=a.foo可以理解为将foo域的方法给到了on域中,所以在调用on域的方法时,不能使用.来调用,而应该使用:来调用

local a = {name = "gcq"}

function a:foo()
    print(self.name)
end

a.on = a.foo
--a.on() --编译出错
a:on() --gcq

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值