函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;
2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
function func_name (arguments-list)
statements-list;
end;
Lua 函数可以返回多个结果值,比如 string.find,其返回匹配串“开始和结束的下标”
- s, e = string.find("hello Lua users", "Lua")
- print(s, e) --> 7 9
- -----------------------------------------------------------------
- function maximum(a) --函数function修饰
- local mi=1 --局部变量
- local m=a[mi]
- for i,val in ipairs(a) do --泛型for循环
- if val > m then --if语句
- mi=i
- m=val
- end
- end
- return m,mi --返回值
- end
- print(maximum({8,10,23,12,5})) --调用函数,打印结果
可变参数:...参数的个数可以是0个或者多个
- printResult=""
- --重写print函数
- function printf(...)
- for i,v in ipairs(arg) do --Lua将参数放在arg列表中
- printResult=printResult .. tostring(v) .. "\t"
- end
- printResult=printResult .. "\n"
- print(printResult)
- end
- printf(3)
- printf(3,4)
- printf(3,4,5,8)
命名参数:可以将参数放在表中,把表作为参数rename{old="temp.lua", new="temp1.lua"}
- function rename(arg)
- return os.rename(arg.old,arg.new)
- end
- rename{old="a.bat",new="b.bat"} --传递表作为参数
匿名函数:函数可以没有名字,函数可以放在变量中,也可放到表中,可以作为参数,可以作为返回值
- a={p=print}
- a.p("Hello world")
- --------------------------------------------------------
- network={ --表
- {name="grauna",IP="210.26.30.34"},
- {name="arraial",IP="210.26.30.23"},
- {name="lua",IP="210.26.23.12"},
- {name="derain",IP="210.26.23.20"}
- }
- for k,v in ipairs(network) do
- print(tostring(v.name .. ":" .. v.IP)); --排序前
- end
- table.sort(network,function(a,b) --函数作为参数,根据name排序
- return (a.name>b.name)
- end)
- for k,v in ipairs(network) do
- print(tostring(v.name .. ":" .. v.IP)); --排序后
- end
当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界。
- names={"Peter","Paul","Mary"}
- grades={Mary=10,Paul=7,Peter=8}
- function sortbygrade(names,grades)
- table.sort(names,function(n1,n2) --sort()可以访问外部函数的参数grades
- return grades[n1]>grades[n2]
- end)
- end
闭包是一个函数加上它可以正确访问的 upvalues。闭包指值而不是指函数,函数仅仅是闭包的一个原型声明
- function newCounter()
- local i=0
- return function() --匿名函数,使用upvalue i保存值,
- i=i+1
- return i
- end
- end
- c1=newCounter() --调用newCounter()创建一个变量i的闭包
- print(c1())
- print(c1())
- c2=newCounter() --c1、c2 是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同
的闭包。c1,c2结果互不干扰。 - print(c2())
- print(c1())
- print(c2())
非全局函数:Lua 中函数可以作为全局变量也可以作为局部变量
- local fact
- fact=function(n)
- if n==0 then
- return 1
- else
- return n*fact(n-1)
- end
- end
- print(fact(5))
尾调用:是一种类似在函数结尾的 goto 调用,当函数最后一个动作是调用另外一个函数时,我们称这种调用尾调用。
- local f,g
- function g()
- f() --不需要返回值给g()
- end
- function f()
- g()
- end