lua函数
发布时间:2020-12-14 21:55:13 所属栏目:大数据 来源:网络整理
导读:Lua的函数定义一般形式如下: optional_function_scope function function_name( argument1,argument2,argument3...,argumentn)function_bodyreturn result_params_comma_separatedend 在 Lua 编程语言的方法定义包括方法头和方法体。这里是方法的所有部件
Lua的函数定义一般形式如下:
optional_function_scope function function_name( argument1,argument2,argument3...,argumentn)function_bodyreturn result_params_comma_separatedend
在 Lua 编程语言的方法定义包括方法头和方法体。这里是方法的所有部件
一、多重返回值
lua函数允许返回多个值,lua会根据不同的调用情况调整函数的返回值数量。
1.函数调用作为一条单独的语句时,lua会丢弃函数的所有返回值。
2.函数作为表达式的一部分来调用时,lua值保留第一个返回值。
3.当函数调用作为一系列表达式 中的最后一个元素时,才能获得它的所有返回值。
4.table构造式可以完整的接收一个函数调用的所有结果,不会有任何数量方面的调整。不过这种行为只有当一个函数调用作为最后一个元素时才会发生,而在其他位置上的函数调用总是只产生一个结果值。
function fun2()
return "a","b"
end
t1 = {fun2()}
for i,v in pairs(t1) do
print(i,v)
end
t2 = {fun2(),"k" }
for i,v in pairs(t2) do
print(i,v)
end
5.也可以把函数调用放入一对圆括号中,迫使它只返回一个结果:
function fun2()
return "a","b"
end
print((fun2()))
6.unpack函数,它接受一个数组作为参数,并从下标1开始返回该函数的所有元素。
二、变长参数
lua函数可以接受不同数量的实参。参数表中的三个点(。。。)表示函数可以接受不同数量的实参。
通常一个函数在遍历其变长参数时只需使用表达式{。。。},就像访问一个table一样。在某些特殊的情况下,变长参数中可能会包含一下故意传入的nil,那么此时需要用函数select来访问变长参数了。调用select时,必须传入一个固定实参selector(选中开关)和一西丽变长参数。如果selector为数字n,则返回第n个实参。否则selector只能为字符串“#”,这样select函数返回变长参数的总数。
function foo(...)
local arg = {...}
for i =1,select("#",...) do
local val = select(i,...)
print(val)
end
end
foo(1,5,6,9,nil,8,87)
三、具名实参
lua的参数传递机制是具有“位置性”的,在调用一个函数时,实参是通过它在参数表中的位置与形参匹配起来的。lua函数不接受具有名称的实参。但是可以将所有的参数组织到一个table中,并将table作为唯一的实参传递给函数。
四、lua函数的特性
lua函数是“第一类值”,它与其他传统类型的值具有相同的权利。可以存储到变量中,可以作为实参传递给函数,也可以作为函数的返回值。函数也可以嵌套在另外一个函数中,内部的函数可以访问外部函数中的变量。
函数和所有其他值一样是匿名的,当讨论一个函数名时,实际上是在讨论一个持有某个函数的变量。因此,一个函数定义,实际上就是一条语句,这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。
五、closure(闭合函数)
将一个函数写在另外一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称为“词法域”。
一个closure是一个函数加上该函数所需访问的所有“非局部的变量”。
六、尾调用
“尾调用”就是一种类似goto的函数调用。当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用”。
function f(x)
return g(x)
end
以上这种情况就是尾调用。f在调用完g之后再无其他事情可做。因此,程序不需要返回f函数。所以在“尾调用”之后,程序不需要保存任何关于该函数的堆栈信息。这种实现称为支持“尾调用消除”。由于“尾调用”不会消耗堆栈空间,所以一个程序可以拥有无数嵌套的“尾调用”。需要注意的是,要确保当前的调用是一条“尾调用”。判断的准则是“一个函数在调用完另一个函数之后,是否就无其他事情需要做了”。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |