如何定义函数
2017-12-01 00:00:00


一般来说函数的定义方法如下:

 function  functionname(arg)

 block

 return

 end

中间的block可以很长,也可以很短。里面的内容不会被预定义也不会被预处理。

举例:封装一个阶乘函数

一、functionname

我们采取一个标识符来给函数命名,我们只需知道函数名就可以调用这个函数,即使我们并不知道这个函数怎么实现的。当然,lua中也允许函数匿名出现,这种情况下,lua可以允许我们这样进行定义

_VERSlON=function(a)

  local

return

end

匿名函数为:

此时,我们仅仅是用一个变量来承接这个函数,而这个函数便不会有名字,这个变量仅仅是一个函数类型的变量,他指向这个函数,而我们也可以用其他变量来指向这个函数,比如我们在前文演示中使用到的print,实际上这个函数是匿名的,print只是一个指向其的变量。我们可以通a=print这样的方式,来使a也指向打印这个功能。利用这一特性,我们可以“注释”掉一些系统函数,即重新定义一些系统函数。

二、arg:参数

在我们定义函数的时候,我们可以选择是否定义形式参数,不定义形式参数的函数同procedure这个概念类似,一般只是用来完成一系列动作,因为lua中没有过程这个概念,所以函数要承担这一功能。有时候我们不需要传入参数,只使用一个()。

比如我们定义形式参数的时候,定义了a,b。由于我们知道,lua是不需要声明变量类型的,也就是一个标识符(变量) 可以用来存储不同类型的值而不需重新声明。所以我们只需在括号内写入a,b这两个变量名。这样形式参数就被定义了,如果我们调用的时候,我们可以选择给函数传入实际参数,一般的,我们最好将形式参数与实际参数匹配,但大多数情况,你不小心少传入或多传入的时候,也是不会报错的。

三、可变参数

在实际应用中,我们会发现,我们有的时候需要传入的参数个数并不是确定的,在这种情况下,lua允许我们用一种特殊的定义形式参数的办法,这个时候,我们可以传入任意数量的实际参数,lua将之盛放在一个表中,在这个表中,域n为参数个数。我们可以用第五讲的最基础迭代器来遍历这个表。

定义一个参数为可变参数的函数:

在参数中也可以加入实际参数a,b:

注意:在传入参数值的过程中也要注意参数个数,传入过少可能会导致函数不能工作或赋值为空。

四、命名参数

Lua中传递参数的机制与赋值相同,我们想精准的将实际参数传给某一个形式参数可以将参数整体变为一个表,这个表使用要调用函数的形式参数作为索引,域为实际参数。自然,我们要重新定义我们需要调用的函数。我们也可以使用哑元,但我们一般意义上来说,这样传参是在很多可选参数的时候,为了防止程序员思维混乱而使用这种方法。

传入哑元用下划线_: