Lua函数的调用(:和.的调用区别)

本文转载并修改于:http://blog.csdn.net/qq_28290581/article/details/52462841

本人稍加修改。

Lua中类的函数定义方式有三种方法:

定义方式:
①tab.func=function ( 参数)
– body
end

②function tab.func( 参数)
– body
end

③function tab:func( 参数)
– body
end

其中,①②两种定义方式与普通函数的定义一样。
方式③采用‘:’来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self

Lua中类的函数使用方式有两种方法:
①tab.func(参数)
②tab:func(参数)

其中,①调用方式与普通函数的调用一样。
方式②采用‘:’来调用函数,实际上隐式的把tab自己当作第一个实参传递即tab:func(参数)相当于tab.func(tab,参数)

下面我们来看代码演示:

tab={}  
function tab.func( a,b )  
    print(a,b)  
end  
tab.func("第一个参数","第二个参数")  

大家可以自己演示一下,上面的输出就是“第一个参数”,“第二个参数”。

接着将最后一句的调用,换为

tab:func("第一个参数","第二个参数") 

此时的输出结果就是:
table: 008AB9C8 第一个参数

这是因为,我们改为使用’:'的方式调用函数时,隐式的把tab本身作为第一个实参传递给了函数,即**a=tab,b=“第一个参数”,参数(“第二个参数”)**则被抛弃了。

接着我们再换个定义的方式:

tab={}
function tab:func( a,b )  
    print(a,b)  
end  
tab:func("第一个参数","第二个参数")  

可以看到,我们这里定义类的函数方式,是使用 : 定义的
输出结果为"第一个参数 第二个参数"。

现在我们改变调用的方式,即将上面最后一行的调用改为如下:

tab.func("a","b")

输出结果变为:“第二个参数 nil”。

这是因为,我们用**“:”方式定义函数**,则隐式地多出一个形参,假设这个形参的名字为hide。则定义函数时tab:func(a,b)就相当于tab.func(hide,a,b)

那么当我们使用**"."来调用函数时,我们只传入了两个参数,其中参数"第一个参数"传递给了hide,参数"第二个参数"传递给了a,最后,nil作为参数传递给了b。**

在没改变函数调用方式之前,我们采用**‘:’的方式定义和调用函数**。调用时传递自身参数给了定义时隐式定义的形参。 即调用时为:tab:func(tab,“第一个参数”,“第二个参数”)

总结

使用":"定义类的函数时:
隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self

使用‘:’来调用函数:
实际上隐式的把自己当作第一个实参传递即tab:func(参数)相当于tab.func(tab,参数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值