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,参数)

猜你喜欢

转载自blog.csdn.net/qq_28644183/article/details/72884488