lua函数的学习

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)
end
D,非全局递归函数需要先声明

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

你可能感兴趣的:(lua函数的学习)