lua 语言包含下面一些基本类型nil,boolean,number,string,function,table,thread ,userdata
其中函数使用起来比较灵活,参数传递和结果返回都很方便,闭包的特性又让它非常类似js的编程特点,我就在下面展示一些函数的基本使用。
A,函数返回多个结果(多余的返回值被discard掉)
function jisuan(a, b) return a+b,a-b end local a,b = jisuan(5,4) print(a,b)B,传递可变参数,通过遍历arg变量获取
function say(a, b, ...) print(a,b) for i,v in ipairs(arg) do print(v) end end say("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.age end) for i,v in ipairs(tbl) do print(v.name,v.age) endD,非全局递归函数需要先声明
local fact fact = function (n) if n == 0 then return 1 else return n*fact(n-1) -- buggy end end print(fact(4))E,正确的尾递归,避免栈溢出
--正确的尾调用 return another_func(x) --错误的尾调用,栈溢出 return another_func(x) + 1 return x or g(x)
F,下面用协程函数实现一个简单的生产者-消费者程序,键盘输入充当生产者,consumer函数获取键盘输入
function producer() -- 生产者协程函数 return coroutine.create(function() -- 产生消息暂停生产活动 while true do local msg = io.read() -- 暂停这个协程函数的运行 coroutine.yield(msg) end end) end function consumer(prod) -- 轮询等待消息 while true do -- 恢复运行producer函数获取结果,resume-yield可以相互交换数据。 local status, msg = coroutine.resume(prod) print("get " .. msg) end end -- 将producer函数作为参数传入 consumer(producer())
G,三个协程函数共同操作数据
-- 操作者A co1 = coroutine.create(function(idx) -- 满足条件 while idx < 10 do -- 操作数据 print("co1: " .. idx) idx = idx + 1 -- 让出cpu给操作者B,并获取结果idx status,thread,idx = coroutine.resume(co2,idx) end end) -- 操作者B co2 = coroutine.create(function(idx) -- 满足条件 while idx < 10 do -- 操作数据 print("co2: " .. idx) idx = idx + 1 -- 让出cpu给操作者C,并获取C的结果,然后挂起自身,让出CPU回给A status,thread,idx = coroutine.resume(co3,idx) idx = coroutine.yield(co2,idx) end end) -- 操作者C co3 = 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) end end) -- 唤起操作者A coroutine.resume(co1,1)
输出结果如下:
>lua -e "io.stdout:setvbuf 'no'" "test.lua" co1: 1 co2: 2 co3: 3 co1: 4 co2: 5 co3: 6 co1: 7 co2: 8 co3: 9 >Exit code: 0