加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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中可以通过下面的逗号分隔的返回值,return关键字返回多个值。

一、多重返回值
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函数。所以在“尾调用”之后,程序不需要保存任何关于该函数的堆栈信息。这种实现称为支持“尾调用消除”。由于“尾调用”不会消耗堆栈空间,所以一个程序可以拥有无数嵌套的“尾调用”。需要注意的是,要确保当前的调用是一条“尾调用”。判断的准则是“一个函数在调用完另一个函数之后,是否就无其他事情需要做了”。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读