function add (a,b) --a,b形参,可以只传一个实参,这时b为nil
local sum = 0
for i,v in ipairs(a) do
sum = sum + v
end
return sum --返回值
end
多重返回值
function maxinum(a)
local mi = 1
local m = a[mi]
for i,val in ipairs(a) do
if m<val then
m = val
mi = i
end
end
return mi ,m
end
x,y,z = maxinum(a) -- x = mi,y = m,z = nil
t = {maxinum(a)} --t={mi,m}
如果t = {maxinum(a),"x"} --t={mi,"x"}
return maxinum(a)--返回所有返回值
return (maxinum(a))--返回一个返回值
--unpack()函数 返回这个数组中所有的元素
a,b = unpack{10,30,45} --a = 10,b = 30 45丢弃
变长参数:
function add(...)
local s = 0
for i,v in ipairs{...} do
s = s+v
end
return s
end
这时add()可以接收可变参数
具名实参:
os.rename(old = "temp.lua",new = "temp2.lua")
或者用table
rename{old = "temp.lua",new = "temp2.lua"}
第一类值:相当于函数指针
词法域:
a = {p = print}
a.p("hello") --hello
print = math.sin
a.p(print(math.pi/2)) -->1
function foo(x) return 2*x end <--->foo=function(x) return 2*x end
匿名函数的使用:
network = {{name="grauna",IP = "192.168.1.123"}
{name="go",IP = "192.168.1.133"}
{name="cpp",IP = "192.168.1.323"}
{name="php",IP = "192.168.1.423"}
{name="dera",IP = "192.168.1.523"}}
table.sort(network,function(a,b) return (a.name > b.name) end )
高阶函数:
function deriative(f,delta) --f为函数
delta = delta or le-4
return function (x)
return (f(x+delta)-f(x))/delta
end
end
names = {"Peter","Paul","Mary"}
grades = {Mary=10,Paul=7,Peter=8}
函数内部的函数可以访问外部函数的局部变量
function sortbygrades(names,grades)
talbe.sort(name,function(a,b) return (grades[a]>grades[b]) end)
end
对函数的限制
do
local olOpen = io.open
local access_OK = function(filename,mode) <检测访问权限> end
io.open = function(filename,mode)
if access_OK(filename,mode) then
return olOpen(filename,mode)
else
return nil,"access denied"
end
end
end
局部函数定义
例:
lib={}
lib.foo = function(x,y) return x+y end
lib={foo = function(x,y) return x+y end}
function lib.foo(x,y) return x+y end
local f=function(参数)
《函数体》
end
local function f(参数)
《函数体》
end
n的阶乘
local fact --要先定义一个局部变量,要不然递归的时候fact没有完全初始化
fact=function(n)
if n==1 then
return 1
else
return n* fact(n-1)
end
end
正确的尾调用:当一条函数调用一个函数后没有其他要执行的,这时就叫尾调用,他不占任何的占空间
function f(x)
<函数代码>
return g(x)
end--------------------尾调用
function foo(n)
if n>0 then
return foo(n-1)
end
end
return g(x)+1 --不是尾调用,还要做一次加分
return x or g(x) --同上
return (g(x))--同上