博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
09:function用法特性
阅读量:6679 次
发布时间:2019-06-25

本文共 3675 字,大约阅读时间需要 12 分钟。

01:函数的定义

optional_function_scope function function_name( argument1, argument2, argument3…, argumentn)
function_body
return result_params_comma_separated
end

optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。

function_name: 指定函数名称。

argument1, argument2, argument3…, argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

function_body: 函数体,函数中需要执行的代码语句块。

result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

--函数返回两个值的最大值function max(num1,num2)if num1>num2 thenreturn num1elsereturn num2endendprint(max(10,20))

02:函数作为数据赋值

sum=maxprint(sum(200,100))

03:将函数作为参数传递给函数

myprint=function(parm)print("打印函数",parm)endfunction add(num1,num2,functionPrint)result=num1+num2functionPrint(result)endmyprint(10)add(10,10,myprint)--打印函数	10--打印函数	20

04:多返回值

function maxNum(a)return a,2*a;endb,c=maxNum(5)print(b,c)--打印函数	10--打印函数	20

05:可选参数

Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 … 表示函数有可变的参数

--可选参数function test(...)local sums={...} --{...} 表示一个由所有变长参数构成的数组  for k,v in pairs(sums)doprint(v)endendtest(4,5,8)
function average(...)result=0local arg={...}for k,v in pairs(arg) doresult=result+vendprint("总共传入" ..#arg .." 个数")return result/#argendprint(average(4,58,89,99))

06.unpack

unpack( )函数是接受一个数组来作为输入参数,并默认从下标为1开始返回所有元素。

local a={
1,2,3,4};print(unpack(a))1234

07.具名实参

Lua中的参数机制是具有“位置性”的,也就是说在调用一个函数时,实参是通过它在参数表中的位置与形参匹配起来。但有时通过名称来指定实参也是很有用的。
将所有的实参组织到一个table中,并将这个table作为唯一的实参传给函数,使用时可以通过table查找到需要的值。

function rename_file(arg)print(arg.old,arg.new);if type(arg.old) == "string" then    print("no old name!")	endendrename_file{
old = "old.txt", new = "new.txt"}old.txt new.txtno old name!

08.函数是可以作为变量存储的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

function foo(x)print(x)endfoo1=function(x)print(x)endfoo(100);foo1(100);100100

在这里插入图片描述

10.局部函数

在这里插入图片描述

--函数存储在table中lib={
};lib.foo=function(x,y)return x+y;endlib.goo=function(x,y)return x-y;end//或者这样lib={
foo=function(x,y) return x+y;end,goo=function(x,y) return x-y;end }print(lib.foo(10,10)); --20print(lib.goo(20,10)); --10

在这里插入图片描述

local foo=function (x,y)return x+y;endlocal function foo(x,y)return x+y;endprint(foo(20,20));

11.闭合函数

函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值
类似于静态局部变量(static)
在这里插入图片描述

local names={
"Peter","Paul","Mary"};local grades={
Peter=10,Paul=7,Mary=8};--table.sort(names,function (n1,n2) -- return grades[n1]>grades[n2];--end);function sortbyGrade(names,grades) table.sort(names,function (n1,n2) return grades[n1]>grades[n2]; end);endnewTable=sortbyGrade(names,grades);for i, v in ipairs(names) do print(i..':'..v);end1:Peter2:Mary3:Paul

例子2

--闭合函数--local i就属于一个非局部变量,因为它既不是全局变量,也不是单纯的局部变量(因为另外一个函数可以用到它)--再来回到定义,GetCount函数里的那个函数,加上非局部变量i,就构成了一个闭合函数了,就这么简单。--对于闭合函数而已,属于它的非局部变量,并不是在调用它的时候临时产生的,而是和它一起存在的。--所以每次调用闭合函数,非局部变量的值都不会被重置function GetCount()    local i=0;    return function()        i=i+1;        return i;    endendco1=GetCount(); --非局部变量i是和变量co1一起存在的不是临时产生的co2=GetCount();print(co1());--1print(co1());--2print(co1());--3print("..............");print(co2());--1print(co2());--2print(co2());--3

i非局部变量下

function Count()    return function()       local i=9;        i=i+1;        return i;    end    endco3=Count();print(co3());--10print(co3());--10print(co3());--10

12.非全局函数

函数名称其实也是一个变量名
在编译的时候,mutou函数是编译不过的,因为这个时候pangbai函数未定义,换句话说,pangbai变量并不存在。
只要换一个方式就可以解决这个问题了:

local mutou;local pangbai;mutou= function ()    print("mutou");    pangbai();endpangbai= function()    print("pangbai");endmutou();--mutou--pangbai

13.在table语法相结合来创建局部函数

lib={
};--常规的函数语法lib.foo=function() print("foo")end--构造式来创建局部函数:--lib={
goo=function() print("goo") end}--其它function lib.koo() print("koo");endfunction lib.Joo() print("Joo");endlib.foo(); --foolib.koo(); --koolib.Joo(); --Joo

转载地址:http://dnrxo.baihongyu.com/

你可能感兴趣的文章
《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
查看>>
《代码整洁之道:程序员的职业素养》一一1.3 首先,不行损害之事
查看>>
intellij 创建java web项目(maven管理的SSH)
查看>>
spring-java项目中连接redis数据库
查看>>
UML介绍--用例图
查看>>
阿里云DTS VS MySQLdump
查看>>
为android封装的百度定位组件
查看>>
我的友情链接
查看>>
Linux系统新手学习的11点建议
查看>>
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>
通过TFTP服务器拷贝路由器的配置文件到本地
查看>>
南方电网广东公司荣获“IT用户最佳实践案例奖”
查看>>
Yesod - 数据库 (9)
查看>>
redis多数据库
查看>>
RHCE认证培训+考试七天实录(五)
查看>>
ip nat translation (timeout)
查看>>
创建外网 ext_net - 每天5分钟玩转 OpenStack(104)
查看>>
api数据分页的两种方式的比较
查看>>
Python OpenCV学习笔记之:图像直方图反向投影
查看>>
布隆过滤器:实现代码
查看>>