lua 函数

来源:互联网 发布:淘宝如何装修手机店铺 编辑:程序博客网 时间:2024/05/28 04:54

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

returnfunction (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))--同上







0 0
原创粉丝点击