Lua学习记录(2) --- Lua中的复杂变量类型_function
在lua中 函数也是一种特殊的变量类型。就和C#中的函数类似,只不过定义的方式有一些不同。同时呢,返回值也会有一些差别
----------------------------------------------------------------函数的声明------------------------------------------
一、函数的声明
在Lua中的函数一般有如下两种方式声明:
-- 函数也是特殊的变量类型 下面是函数的基本两种声明语法
-- 方式一
-- function 函数名()
-- end-- 方式二
-- a = function()
-- end
下面写一些简单的示例函数
1、无参无返回值函数
-- 无参数无返回值的函数
function sayHello()print("Hello Lua!")
end
sayHello() -- 调用函数F2 = function ()print("Hello Lua F2!")
end
F2()
2、有参无返回值的函数
值得注意的是,如果输入的参数和定义时的参数个数不匹配的话,会自动丢弃某些参数。如果不传参数的话,默认传参为nil
-- 有参数无返回值的函数 不传参的话就会认为是参数为空
-- 如果传入参数和格式不匹配 只会补空或者丢弃多余参数
function sayHelloName(name)print("Hello "..name.."!")
end
sayHelloName(555)
3、有参有返回值的函数
在lua中 是允许多返回值的 你可以一个return 返回出去多个结果。只要你在接受的时候用多个容器来接收就行。
-- 有返回值的函数
-- 多返回值的时候 在前面声明多个变量来接取 如果变量
-- 不够的话 默认丢弃多余的 返回值不够的话 默认补nil
function F4(a)return a,12,true
end
temp1,temp2,temp3 = F4(100)
print("temp1="..temp1.." temp2="..temp2.." temp3="..tostring(temp3))
函数也是有类型的 函数的类型就是function 可以使用type进行查看哦
--------------------------------------------------------函数的重载-----------------------------------------------------
二、函数的重载
在lua中是不支持函数重载的,后定义的函数会默认覆盖前面定义的函数的!
---------------------------------------------------------变长参数---------------------------------------------------------
三、变长参数
在C#中我们可以通过关键字params进行未知参数个数的传递,那么在lua中怎么实现呢?通过 ... 这样进行参数传递即可。例如:
这里的表,我们会在后面的文章中继续学习,这里大家就记住这种写法就是变长参数的传递了!使用的话,就按照代码中写的使用方式进行使用即可。这个#还记得吗,就是取长度的关键符号
-- 变长参数
function F7(...)-- 变成参数使用必须先用一个表存起来再用arg = {...} -- 把变参放到一个表里for i=1,#arg doprint("arg["..i.."]="..tostring(arg[i]))end
end
F7(1,"hello",true,5.6)
-------------------------------------------------------函数的嵌套-------------------------------------------------------
四、函数的嵌套
既然函数也是一个变量,那么我们呢,就可以返回一个函数出去,如下,这就是函数的嵌套
-- 函数的嵌套
function F8()return function ()print("Hello Lua F9!")end
end
然后这样使用就行了
f9 = F8() -- 先调用外层函数
f9() -- 再调用内层函数
利用在C#中学习过的知识我们可以很敏锐的发现,函数之间的嵌套很容易发生闭包的问题,什么是闭包呢,闭包就是函数中的变量生命周期并没有按照函数的结束而消失,反而继续存在。如下:当我们执行完F9函数后,居然能够在f10中仍能体会到x的影响,这就是闭包
function F9(x)-- 改变了传入参数的生命周期return function (y)return x + yend
end
f10 = F9(5555);
print("闭包结果为"..f10(5)) -- 传入参数
好的 今天的function学习之旅到此结束!下面我们将要学习的是table!
