lua函数的学习

来源:互联网 发布:淘宝只装无线瑞 编辑:程序博客网 时间:2024/05/27 00:42

lua 语言包含下面一些基本类型nil,boolean,number,string,function,table,thread ,userdata

其中函数使用起来比较灵活,参数传递和结果返回都很方便,闭包的特性又让它非常类似js的编程特点,我就在下面展示一些函数的基本使用。

A,函数返回多个结果(多余的返回值被discard掉)

function jisuan(a, b)return a+b,a-bendlocal a,b = jisuan(5,4)print(a,b)
B,传递可变参数,通过遍历arg变量获取

function say(a, b, ...)print(a,b)for i,v in ipairs(arg) doprint(v)endendsay("I","have","so","many","work","to","do")
C,使用闭包函数实现自定义排序

local tbl = {}tbl[1] = {name="ciaos", age=23}tbl[2] = {name="penjin", age=24}tbl[3] = {name="littley", age=22}table.sort(tbl,function(a,b)return a.age < b.ageend)for i,v in ipairs(tbl) doprint(v.name,v.age)end
D,非全局递归函数需要先声明

local factfact = function (n)if n == 0 thenreturn 1elsereturn n*fact(n-1) -- buggyendendprint(fact(4))
E,正确的尾递归,避免栈溢出

--正确的尾调用return another_func(x)--错误的尾调用,栈溢出return another_func(x) + 1return x or g(x)

F,下面用协程函数实现一个简单的生产者-消费者程序,键盘输入充当生产者,consumer函数获取键盘输入

function producer()    -- 生产者协程函数return coroutine.create(function()-- 产生消息暂停生产活动while true dolocal msg = io.read()-- 暂停这个协程函数的运行coroutine.yield(msg)endend)endfunction consumer(prod)-- 轮询等待消息while true do-- 恢复运行producer函数获取结果,resume-yield可以相互交换数据。local status, msg = coroutine.resume(prod)print("get " .. msg)endend-- 将producer函数作为参数传入consumer(producer())

G,三个协程函数共同操作数据

-- 操作者Aco1 = coroutine.create(function(idx)    -- 满足条件while idx < 10 do    -- 操作数据print("co1: " .. idx)idx = idx + 1-- 让出cpu给操作者B,并获取结果idxstatus,thread,idx = coroutine.resume(co2,idx)endend)-- 操作者Bco2 = coroutine.create(function(idx)    -- 满足条件while idx < 10 do    -- 操作数据print("co2: " .. idx)idx = idx + 1-- 让出cpu给操作者C,并获取C的结果,然后挂起自身,让出CPU回给Astatus,thread,idx = coroutine.resume(co3,idx)idx = coroutine.yield(co2,idx)endend)-- 操作者Cco3 = coroutine.create(function(idx)    -- 满足条件while idx < 10 do    -- 操作数据print("co3: " .. idx)idx = idx + 1-- 挂起操作者C,并传回idx给操作者B,并获取下一次操作者B唤起C的idx值idx = coroutine.yield(co3,idx)endend)-- 唤起操作者Acoroutine.resume(co1,1)

输出结果如下:

>lua -e "io.stdout:setvbuf 'no'" "test.lua" co1: 1co2: 2co3: 3co1: 4co2: 5co3: 6co1: 7co2: 8co3: 9>Exit code: 0
原创粉丝点击