1、概念
在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。
Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。
Lua 函数主要有两种用途:
1.完成指定的任务,这种情况下函数作为调用语句使用;
2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
基本写法
function 函数名()
end
还有一种特殊写法
a(变量)=function()
end
==我感觉像lua这种随便的语言,写起来爽了,维护起来就要疯了0.0==
2、操作
2.1 无参数无返回值
--无参数无返回值
--跟C#不一样,lua是从上到下执行的,不能在一个函数之前调用函数
function F1()
print("函数被调用")
end
F1()
还有另外一种写法
--这种写法可以把它理解为把名字提前写了(不完全是)
--有点类似于C#中的委托和事件,通过赋值的形式去等于一个函数
F2 = function()
print("F2函数被调用")
end
F2()
==注意:跟C#不一样,lua是从上到下执行的,不能在一个函数之前调用函数(会报错)==
因为lua是解释型语言,使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是像编译型语言在执行之前就完成翻译。
2.2 有参函数
--有参函数
--函数类型不指定,可以传任意的参数进去
function F1(a)
print(a)
end
F1(1)
F1('666')
F1(true)
F1(nil)
--像下面这两个操作这放在C#中肯定会报错
F1()--不会报错 只会补空nil 或者丢弃
F1(6,6,6)--不报错,传入参数与函数参数不匹配,取第一个参数
2.3 有返回值函数
--有返回值函数
function F2(a)
return a
end
Temp = F2(666)
print(Temp)
我们再来搞点骚操作
我们return多个参数,但lua只返回了读取的第一个参数,相当于其他参数都被丢弃了
如果我们想要多个返回值
正确写法
function F2(a)
return a,"123",true
end
--多返回值时 在前面申明多个变量来接取即可
--就一一对应了,在声明变量的时候也可以,比如a=1,b=2 ,直接写成a,b=1,2
Temp,temp2,temp3 = F2(666)
print(Temp)
print(temp2)
print(temp3)
==总结一下==
就是这个语言太随便了
- 多返回值时,在前面申明相对应的变量来接取就行
- 如果变量不够,不报错,直接接取对应位置的返回值(后面的都不要了)
- 如果变量多了,不报错,直接赋值nil
2.4 获取函数类型
F3 = function ()
print('lua真随便')
end
print(type(F3))
2.5 函数的重载(Lua不支持)
--lua不支持函数的重载
--函数名相同,参数类型不同或者参数个数不同叫函数的重载
--lua会默认调用最后声明的函数
--举个例子
function F4()
print('hello')
end
function F4(str)
print('Bye')
end
F()
2.6变长函数
--变长参数
--通过for循环把传进函数的参数都打印出来
function F5( ... )
nums={...}
for i=1,#nums do
print(nums[i])
end
end
F5(1,2,3,4,5,6)
print('--------------------------------------')
F5(6,"hello",true,nil)--不同参数也可以打印
nums的作用
2.6函数嵌套
--函数嵌套
function F6()
return function ()
print('嵌套函数')
end
end
F7 = F6()
F7()
--闭包
--外部传进来的这个x实际上会产生一个临时变量,我们把这个X包裹到了function (y) return x+y end这个函数里面
--相当去在这改变了传入参数的 生命周期
function F8(x)
return function (y)
return x+y
end
end
F9 = F8(2)--按理说这个F8(2)执行完毕就没有用了,但我们改变了函数的生命周期,把那个2放到了function (y)这个函数里面去了
print(F9(1))--F9实际上执行的是 function (y)这个函数